这个查询有什么问题?从mysql表加载数据需要0.5到0.6秒,记录超过220,000条

时间:2018-04-30 11:00:56

标签: php mysql mysqli query-optimization

此查询有什么问题?从mysql表加载数据需要0.5到0.6秒,超过220,000条记录

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

2 个答案:

答案 0 :(得分:0)

这不是一个完整的答案(至少目前为止),但是太大而无法发表评论。

您可以向表中添加索引。这样做的语法是: -

https://dev.mysql.com/doc/refman/8.0/en/create-index.html

我会猜测,使用columns_id和student_id列的索引可能对大多数人有帮助。

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

这可能需要一些时间(tbh,可能不是在这种情况下,但需要注意更大/更复杂的索引)。

请注意,MySQL通常会在表上使用单个索引,而不是组合索引。因此,您设置了一个涵盖多个列的索引。

答案 1 :(得分:0)

namespace readtask
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button2_Click(object sender, EventArgs e)
        {

            Process.Start(@"E:\SAMPLE PROJECTS\TaskName.xml");
        }
    }
}

这是什么意思?

correct = 'N' ||  'NA'

嗯,这并不意味着其中任何一个。

要更快地运行,请添加此复合索引:

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

列的顺序很重要。 (但这不是唯一的最佳排序。)单列索引不是很好。 Kichstart的索引都没有那么好,因为它不包括所有INDEX(assignment_id, topic_id, correct, student_id) 第一个

基数并不重要。

数字与字符串 - 在索引中无关紧要。