如何更快地下订单?

时间:2017-02-28 16:17:16

标签: mysql performance

我有一个包含多个列的表。这些列是浮点值及其对应的索引。该表格约500万行

表结构ID类似于:

UIScrollView

我需要以更快的方式运行此查询,这基本上是100顶级。我想就如何做得更好提出一些建议:

MyTable(id,a,b,c,d,e,f,g,h)
MyWords(id,word)
TableWords(wordID,MyTableID)

索引:

select sql_no_cache a.* 
from MyWords w
left join TableWords wl on w.id = wl.wordID
left join MyTable a on wl.MyTableID = a.id
where w.word = 'WordToSearch'
order by a.a desc
limit 100

使用说明:

ALTER TABLE `a` ADD INDEX `a` (`a`);
ALTER TABLE `a` ADD INDEX `b` (`b`);

描述表格:

1   SIMPLE  w   const   uniqueWord,fulltext_word    uniqueWord  63  const   1   Using temporary; Using filesort
1   SIMPLE  wl  ref wordID  wordID  4   const   5597    
1   SIMPLE  a   eq_ref  PRIMARY,id  id  4   test.wl.a   1   

描述MyWords:

MyTableID   int(11)   NO    MUL
wordID      int(11)   NO    MUL

描述MyTable:

id      int(11)     NO  PRI     auto_increment
word    varchar(20) YES UNI     

我可以通过我的桌面订购而且速度很快,但是当我向该表进行左连接时,它不再使用索引了。我在问题中添加了更多数据。

由于

2 个答案:

答案 0 :(得分:0)

如果您正在寻找特定的优化,则需要提供更多信息。但是在一般意义上,这里有一些你可以研究的东西。我将提供一个简短的列表,其中包含完整详细信息的链接。

  1. 使用索引
  2. 修改/更新 filesort 算法
  3. 确保列仅使用所需的最小空间
  4. 临时目录中有大量可用空间
  5. 优化订单依据: https://dev.mysql.com/doc/refman/5.7/en/order-by-optimization.html

    优化限制: https://dev.mysql.com/doc/refman/5.7/en/limit-optimization.html

答案 1 :(得分:0)

加快速度的唯一方法是在同一个表中使用worda拥有INDEX(word, a)

通过这样做,两者过滤(WHERE word = '...')并且排序可以在索引中完成。这允许LIMIT 100简单地剥离前100行 - 而不是收集所有过滤的行,对它们进行排序,然后才能剥离100行。

还有另一项要求:'WordToSearch'必须只映射到一个a.id。从您的描述中不清楚连接是1:1还是1:很多或很多:很多。