使用庞大的表格时出现性能问题
我使用以下方法在列上添加索引:
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。为什么?
答案 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 BY
。 More 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将开始搜索索引值,跳过该请求的大量无用数据。