我有很长的执行时间(而不是长的提取时间),使用Python从一个大表中获取数据,我想了解是否有任何明显的错误。
我的表定义如下:
create table mytable(
a varchar(3),
b bigint,
c int,
d int,
e datetime,
f varchar(20),
g varchar(10),
primary key(a, b, c, d))
ENGINE=InnoDB;
它目前包含1.5亿行,表大小估计为19 is。
Python代码如下:
import MySQLdb
database = MySQLdb.connect
假设在tableX中我们有id(主键) name和age、phone,它们都带有索引。
在这个查询中:select phone from tableX where name='Dennis' order by age
我想这个过程是
使用name索引获取与Dennis匹配的ids。表示S设置的id
L 使用age索引对在1中获得的id进行排序,得到一个排序的id列表,由表示
phone 使用排序后的id list L来获取
我假设在步骤2中,它可以使用沿B+树叶节点的顺序扫描,检查该叶节点中的id是否在步骤1中获得的id集S中。如果是,将其添加到list L中,那么我们可以得到
这是用于InnoDB和MySQL 5.7的。
如果我有这样的查询:
SELECT A, B, C FROM TABLE WHERE STRCMP(D, 'somestring') > 0
是否可以在D上建立一个可供查询使用的索引?也就是说,MySQL是否足够聪明地为STRCMP函数使用btree索引?
如果没有,我如何才能重新设计查询(和/或表),以便能够对D进行字符串比较,并且可以进行某种形式的剪枝,从而不必命中每一行?
我有两个表,表A包含700,000个条目,表B包含600,000个条目。结构如下:
表A:
+-----------+---------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+---------------------+------+-----+---------+----------------+
| id | bigint(20) u
我将在MYSQL数据库上制作一个非常大的位置表。第一列是位置的x值或水平值,第二列是位置的y值或垂直值。(如经度和纬度,但带有无符号整数)。
CREATE TABLE IF NOT EXISTS `locations` (
`horizontal_position` INT NOT NULL,
`vertical_position` INT NOT NULL,
/*other columns*/
)
X值和y值都同样重要,所以我考虑过需要一个双主键,但我甚至不知道这是否可能。我认为最好使用B树算法进行索引,但我不知道如何使它同时使用x和y列。我可以绕过这
不是索引的列是否与MySQL、MyISAM和InnoDB中的索引一起在磁盘上排序?
一个错误的想法,我开始写:
我认为这可能不是,因为它们没有被索引;如果它们是排序的,那就意味着它们是索引。
这是不正确的,因为每个索引列都是按照其自身内容的顺序排序的,但我询问的是是否对每一行(或仅对某些列)与其相应的索引进行排序。
为了解释,我说:这将有助于选择行的范围,这些行并排,并排,根据它们的索引,更快。例如,如果我想要select * where id >1000 and id<2000 ( MySQL语法中可能有错误,我不太了解它),那么,id列本身可以从磁盘中快速读取,因为可能它的10
假设有一个表T,列C由B树索引,并且给定常数k。假设以下查询的结果为n:
select count(*) from T where C > k;
我在MySQL(InnoDB)中尝试了这样的查询,列C由B树索引,我发现n的值越大,查询就越慢。在一张大桌子(GB)上,我甚至不得不等待几分钟。因此,我推测时间复杂度关于n是线性的,但我知道如果一个人在B-Tree内部节点上存储聚合信息,那么可以在对数时间内相对于表的大小来完成。
有没有人能推荐一些使用对数解决方案的数据库管理系统,或者可以减少MySQL查询时间的技巧?
嗨,我对MySQL指数有一定程度的了解。
创建表时,我可以创建一个索引
CREATE TABLE Product (
-> ID SMALLINT UNSIGNED NOT NULL,
-> ModelID SMALLINT UNSIGNED NOT NULL,
-> PRIMARY KEY (ID),
-> INDEX (ModelID)
在创建表之后添加索引
CREATE INDEX index_name
ON table_name (column_name)
还可以通过以下方式更改索引
ALTER TABLE
我目前正在使用utf8 mysql数据库。它检查翻译是否已经在数据库中,如果没有,则进行翻译并将其存储在数据库中。
SELECT * FROM `translations` WHERE `input_text`=? AND `input_lang`=? AND `output_lang`=?;
(另一个字段是“output_text”。)对于一个基本数据库,它首先将输入的文本与"input_text“" text”字段进行逐个字母的比较。只要角色匹配,它就会不断地比较它们。如果它们停止匹配,就会转到下一行。
我不知道数据库在底层是如何工作的,但我假设对于一个基本数据库,在决定输
我已经被告知很多次,mysql使用B+树作为索引数据结构,它也在B+树中表示索引故事。但是我在Mysql官方文档中发现了一些不同的东西,在中它写着Most MySQL indexes (PRIMARY KEY, UNIQUE, INDEX, and FULLTEXT) are stored in B-trees
所以我想知道哪一个是正确的,B树还是B+树?
我经常使用下面的查询:
SELECT * FROM table WHERE Timestamp > [SomeTime] AND Timestamp < [SomeOtherTime] and publish = 1 and type = 2 order by Timestamp
我想优化这个查询,我正在考虑把timestamp作为聚集索引的主键的一部分,我认为如果timestamp是主键的一部分,那么插入到表中的数据将按timestamp field.Also顺序写入磁盘。我认为这会大大改善我的查询,但不确定这是否会有帮助。
table has 3-4 million+ rows
我有一个问题:
Select *
from table
where a>10 and b=10
综合指数为(a,b)。我的问题是,为什么b=10只能在a>10中使用复合索引,而在explain plan中不使用复合索引。我认为即使在a>10时,b也是在B+树中排序的,所以为什么不在字段b中使用indexg呢
我有一个mysql_query。我在想要索引哪一个。
SELECT count(*) FROM foo WHERE c=5 GROUP BY d
也许(c,d)或者仅仅是c?
我还有一个类似的。
SELECT count(*) FROM foo WHERE d=6 GROUP BY b
可能是(d,b)还是只是d?
这里的另一个:
SELECT a FROM foo WHERE b=5 GROUP BY c
这里(a,b,c)?
我的观点是使索引涵盖三个查询。最好的办法是?哪一列?
我有一个有两列的表测试:
varchar(250)
丁质(1)
该表大约有400万行。A包含UTF8字符串,B只能是0或1。
select count(1) from TEST非常快(对于MySQL Workbench,000秒而言),但是select count(1) from TEST where B=1大约需要15秒(在一台相当快的机器上,但是在一个真正的表上,有更多列,这对这个问题不重要)。添加一个索引对B没有帮助-它仍然是一个完整的表格扫描。强制使用索引也于事无补。
存储引擎是MyISAM,因为比插入/更新有更多的选择,这可能是最好的选择。
如何加快这个查询的速度?