这个查询有啥问题?从超过 220,000 条记录的 mysql 表中加载数据需要 0.5 到 0.6 秒
Posted
技术标签:
【中文标题】这个查询有啥问题?从超过 220,000 条记录的 mysql 表中加载数据需要 0.5 到 0.6 秒【英文标题】:What is the issue with this query ? It is taking 0.5 to 0.6 seconds to load data from mysql table with more than 220,000 records这个查询有什么问题?从超过 220,000 条记录的 mysql 表中加载数据需要 0.5 到 0.6 秒 【发布时间】:2018-04-30 11:00:56 【问题描述】:这个查询有什么问题?从超过 220,000 条记录的 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
任何帮助如何更快地获取数据?See the explain result
【问题讨论】:
获得 220,000 个结果只需不到一秒钟的时间,您还在抱怨获得更快的结果吗?对我来说,这已经相当快了 在assignment_id, topic_id , student_id
上使用indexing
。
列上有索引吗?
运行 EXPLAIN 并查看它使用了哪些索引
我知道该表有 220,000,而不是结果...您定义了哪些索引?
【参考方案1】:
这不是一个完整的答案(至少现在是这样),但太大了,不能发表评论。
您可以为表添加索引。这样做的语法在这里:-
https://dev.mysql.com/doc/refman/8.0/en/create-index.html
我猜想在 assignment_id 和 student_id 列上的索引可能最有帮助。
ALTER TABLE `answers` ADD INDEX `assignment_id_student_id` (`assignment_id`, `student_id`);
这可能需要一些时间(tbh,可能不是在这种情况下,但需要注意更大/更复杂的索引)。
请注意,MySQL 通常会在表上使用单个索引,而不是组合索引。因此,您设置了一个涵盖多个列的索引。
【讨论】:
主题栏呢?是否也应该添加?添加此索引会导致现有数据出现问题吗? 可能的。但这不是一个数字列(因此索引会更大),而且好处可能很小。每个 assignment_id / student_id 有多少个主题? 大约有 2000 个主题,因此主题字段中可以包含 2000 个不同的主题,以及主题列数据 例如:23#asjci 但是分配的数量会减少多少?每个作业有多少个主题? 即,例如:有 10 个问题,每 10 个问题将有 10 个主题与之相连,这 10 个问题合并为一个评估,并共享给一组 100 名学生,所以,当每个学生回答一个评估时,答案表中将添加 10 行,所以总共 10 个问题 * 100 个学生 = 1000 行【参考方案2】:correct = 'N' || 'NA'
这是什么意思?
correct = CONCAT('N', 'NA')
correct = 'N' OR correct = 'NA'
嗯,这并不意味着其中任何一个。
要运行得更快,请添加此复合索引:
INDEX(assignment_id, topic_id, correct, student_id)
列的顺序很重要。 (但这不是唯一的最佳排序。)单列上的索引不太好。 Kichstart 的两个索引都没有那么好,因为它不包括所有=
列first。
基数无关紧要。
数字与字符串——在索引中无关紧要。
【讨论】:
以上是关于这个查询有啥问题?从超过 220,000 条记录的 mysql 表中加载数据需要 0.5 到 0.6 秒的主要内容,如果未能解决你的问题,请参考以下文章
在 Redshift 中获取超过 100,000 条记录 [关闭]