SELECT *
FROM sms_report
WHERE R_uid = '159'
AND R_show = '1'
ORDER BY R_timestamp DESC , R_numbers
这是我的查询。现在它正在使用filesort我需要添加索引以便优化它。 以下是解释
的输出id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE sms_report ref R_uid,R_show R_uid 4 const 765993 Using where; Using filesort
该表格为MYISAM
,我在R_smppid, R_uid, R_show, R_timedate, R_numbers
有人建议我添加复合索引。你能告诉我我应该索引哪些字段以及如何编制索引。
答案 0 :(得分:0)
尝试在R_uid,R_show,R_timestamp,R_numbers上使用复合索引 - 这样它应该能够在1个索引中准确找到您要查找的行,并且已经对结果进行了排序。
编辑 - DESC可能会抛出优化......但值得一试
答案 1 :(得分:0)
由于MySQL说可能的密钥== R_uid,R_show
,尝试在这两个密钥上创建一个复合索引。
尝试运行ANALYZE TABLE sms_report;
也许OPTIMIZE TABLE
还可以尝试使用EXPLAIN EXTENDED ...
查看是否能为您提供更多信息。
如果您只对某些列感兴趣,请仅指定这些列而不是*
。一些数据库(我不知道MySQL是否是其中之一)可以跳过读取表并直接从索引返回结果,如果索引包含您感兴趣的所有列。如果您只对R_uid和R_show感兴趣,那么执行SELECT R_uid, R_show FROM ...
代替SELECT * FROM ...
可能会加快速度。 (同样,我不知道这是否适用于MySQL。)
答案 2 :(得分:0)
如何添加索引:
alter table sms_report add index new_index (uid, show, R_timestamp, R_numbers);
如何强制查询使用新索引
SELECT *
FROM sms_report
USE INDEX new_index
WHERE R_uid=159 AND R_show=1
ORDER BY R_timestamp DESC, R_numbers;