MYSQL where子句在大表上性能变慢

时间:2017-07-23 04:11:57

标签: php mysql performance

使用庞大的表格时出现性能问题

我使用以下方法在列上添加索引:

 ALTER table add index column;

并在text / 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秒钟。 //index instead of indexed

 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 select_type:SIMPLE 表:产品 类型:ref possible_keys:猫 关键:猫 Key_len:203 ref:const 行:1732184 extra:使用where

查询工作正常,小表有50k行,但行速为6M。为什么?

4 个答案:

答案 0 :(得分:1)

对于此查询:

SELECT t.*
FROM table t
WHERE cat = 'electronic'
ORDER BY column DESC
LIMIT 0, 40;

最佳索引是table(cat, column)上的综合索引。如果column太宽,您可以使用前缀:table(cat, column(200))

答案 1 :(得分:1)

不要使用前缀,例如-for cmdsubst>; 通常使索引无法使用。我从未见过优化器在面对cat(200)时超过INDEX(a(10), b)并使用a时的情况。

b更改为cat。对于“类别”来说,这可能已经足够了。

最佳指数(如果可能)是

VARCHAR(255)

请注意,INDEX(cat, `column`) 位于cat WHERE。它处理整个=,因此索引可以移至WHERE。因此也可以使用ORDER BYMore discussion of index making

如果column必须是cat,那么您可以做的最好的事情就是

TEXT

然后,优化程序可能决定使用它来避免文件排序。但如果少于40个(参见INDEX(`column`) )'电子'行,则需要进行大扫描,并且可能比不使用索引慢。所以,我不确定它是否值得拥有LIMIT

答案 2 :(得分:-1)

在表上删除无用的索引并尝试“alter table yourtablename add index idx_cat_column(cat,column)”。然后解释一下你的查询sql,看看发生了什么。

答案 3 :(得分:-1)

最好的选择是为表编制索引,如果您不知道如何操作,可以查看this doc 因此,当您执行查询时,mysql将开始搜索索引值,跳过该请求的大量无用数据。