【发布时间】:2014-03-14 21:06:36
【问题描述】:
我有一个 composite_title 字段,它是 VARCHAR(500) 来保存电影或电视节目的标题。以下是它的一些示例:
- The Office, Season 1, Ep. 4 -- The Alliance
- BSG, Season 2, Ep. 3 -- Fragged
- Terminator
当我使用以下方法对字段进行排序时:
select composite_title from title order by composite_title limit 10
它非常慢并且不使用索引,它使用文件排序。我尝试添加类似:
ALTER TABLE title ADD INDEX composite_title(10)
但它并没有提高性能。
我可以做些什么来改进这个查询?
解释
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE title ALL NULL NULL NULL NULL 341353 Using filesort
更新:
数据库中最长的电视节目是 285 个字符。
根据 Bill Karwin 的解决方案,这对我有用:
ALTER TABLE `title` ADD `composite_title_for_sorting` VARCHAR(255) NOT NULL DEFAULT '';
UPDATE IGNORE title SET composite_title_for_sorting=composite_title;
现在,如果我按 composite_title_for_sorting 排序,查询需要 1 毫秒而不是 500 毫秒。
【问题讨论】:
-
如果您想获得建议,请至少在此处发布您的表格结构(运行命令
show create table title并在此处粘贴输出) -
这里只有一列很重要——
composite_title。 -
如果您执行
select *并且您的键远小于用于排序的列,那么很可能索引不起作用。如果没有看到您的表格或explain的输出(顺便说一下,不是排序查询本身,它是一个查询计划),就不能说更多。 -
否,请参阅更新后的问题。
-
尝试做一个
explain ...query它说什么?
标签: mysql performance