这个查询有啥问题?从超过 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 条记录 [关闭]

需要从 Core Data 中读取 10,000 条记录

对包含超过 100,000,000 条记录的文本文件进行排序

处理数十亿条记录的推荐数据库类型

DB2 的 LIMIT 等效项

sql查询获取已删除记录