我有一个包含多个列的表。这些列是浮点值及其对应的索引。该表格约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
我可以通过我的桌面订购而且速度很快,但是当我向该表进行左连接时,它不再使用索引了。我在问题中添加了更多数据。
由于
答案 0 :(得分:0)
如果您正在寻找特定的优化,则需要提供更多信息。但是在一般意义上,这里有一些你可以研究的东西。我将提供一个简短的列表,其中包含完整详细信息的链接。
优化订单依据: 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)
加快速度的唯一方法是在同一个表中使用word
和a
,拥有INDEX(word, a)
。
通过这样做,两者过滤(WHERE word = '...'
)并且排序可以在索引中完成。这允许LIMIT 100
简单地剥离前100行 - 而不是收集所有过滤的行,对它们进行排序,然后才能剥离100行。
还有另一项要求:'WordToSearch'必须只映射到一个a.id
。从您的描述中不清楚连接是1:1还是1:很多或很多:很多。