使用索引优化Mysql表

时间:2010-12-20 04:45:31

标签: php mysql optimization

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

上创建了索引

有人建议我添加复合索引。你能告诉我我应该索引哪些字段以及如何编制索引。

3 个答案:

答案 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;