这个查询有什么问题?从包含22万多条记录的mysql表加载数据需要0.5到0.6秒

fv2wmkja  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(277)

这个查询有什么问题?从包含22万多条记录的mysql表加载数据需要0.5到0.6秒

SELECT correct 
FROM  `answers` 
WHERE  `assignment_id` =2055
AND (
`correct` =  'N' ||  'NA'
)
AND  `topic_id` =  '50#j1_5'
AND  `student_id` 
IN ( 702, 223, 237, 252, 229, 246, 1050, 256, 248, 1049, 243, 241, 244, 242, 249, 236, 250, 245 ) 
LIMIT 0 , 30

有谁能帮助我们更快地获取数据?请看解释结果

pkbketx9

pkbketx91#

correct = 'N' ||  'NA'

那是什么意思?

correct = CONCAT('N', 'NA')
correct = 'N' OR correct = 'NA'

好吧,这两个都不是。
要运行得更快,请添加以下综合索引:

INDEX(assignment_id, topic_id, correct, student_id)

列的顺序很重要(但这并不是唯一的最佳排序。)单列上的索引没有那么好。kichstart的两个索引都没有那么好,因为它没有包含所有 = 列在先。
基数无关紧要。
数字与字符串——在索引中并不重要。

jm81lzqq

jm81lzqq2#

这不是一个完整的答案(至少目前是这样),但太大了,不能作为一个评论。
可以向表中添加索引。这样做的语法是here:-
https://dev.mysql.com/doc/refman/8.0/en/create-index.html
我想,在assignment\u id和student\u id列上建立索引可能最有帮助。

ALTER TABLE `answers` ADD INDEX `assignment_id_student_id` (`assignment_id`, `student_id`);

这可能需要一些时间(tbh,可能不是在这种情况下,而是需要注意更大/更复杂的索引)。
请注意,mysql通常会在表上使用单个索引,而不是合并索引。因此,您可以设置一个包含多个列的索引。

相关问题