我在使用大表时遇到性能问题
我使用这个在列上添加索引:
ALTER table add index column;
在文本/blob 列上:
alter table add index (cat(200));
我的表有大约 6M 行,我正在使用 InnoDB 引擎 (Mysql 5.5)
现在我在“order by”列上添加索引,这个查询非常快:
SELECT * from table order by column DESC LIMIT 0,40
但是当我在此查询上添加 WHERE 子句时,它的速度非常慢,即使使用上面的“cat”列索引,也需要大约 10 秒才能加载。 //索引而不是索引
SELECT * from table WHERE cat = 'electronic' order by column DESC LIMIT 0,40
这个慢查询的解释:
EXPLAIN SELECT * from table WHERE cat = 'electronic' order by 'id' DESC LIMIT 0,40
ID:1 选择类型:简单 表:产品 类型:引用 可能的键:猫 关键:猫 key 长度:203 引用:常量 行:1732184 额外:使用where
查询对于具有 50k 行的小表工作正常,但对于 6M 行则速度较慢。为什么?
最佳答案
不要使用前缀,例如 cat(200)
;它通常会使索引变得不可用。我从未见过优化器在面对INDEX(a(10), b)
时的情况,过去a
并利用b
.
更改cat
成为VARCHAR(255)
。这对于“类别”来说可能绰绰有余。
最好的索引(如果可能的话)是
INDEX(cat, `column`)
请注意cat
位于 WHERE
与 =
。它处理整个WHERE
,因此索引可以移至 ORDER BY
。因此column
也可以使用。 More discussion of index making .
如果cat
必须是TEXT
,那么你能做的最好的就是
INDEX(`column`)
然后优化器可能决定使用它来避免文件排序。但是,如果“电子”行少于 40 个(请参阅 LIMIT
),则需要进行大量扫描,并且可能比不使用索引慢。所以,我不确定它是否值得拥有 INDEX(column)
.
关于php - MYSQL where 子句在大表上性能降低,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45261410/