假设我有一个表学生,其中包含以下字段
ID,student_id数据,test_type,得分
考虑这两个问题
从student_id = x和得分>的学生中选择* ÿ
从学生中选择*,其中student_id = x按分数排序
假设我在student_id和score上都有索引但不是复合索引,数据库将使用哪些索引?查询是否能够使用这两个索引,或者是否可以使用最多一个索引?
假设使用student_id索引我可以限制查询中的结果,我是否可以使用得分索引进行排序或过滤?
或者如果数据库首先选择得分索引进行排序或过滤,我是否可以使用student_id索引进行student_id = x过滤?
答案 0 :(得分:1)
MySQL的优化器希望两个查询都具有复合INDEX(student_id, score)
。
没有复合索引......优化器几乎从不使用两个索引。优化程序会在INDEX(student_id)
和INDEX(score)
之间进行选择。
但还有另一个问题 - 如果这个表是InnoDB,如果它有PRIMARY KEY(student_id)
,那么INDEX(score)
隐含student_id tacked on then end. Hence
INDEX(得分)`将是< em>第一次查询。
给定两个索引,优化器会查看基数以及其他各种东西。
答案 1 :(得分:0)
那肯定取决于你的数据集和数据库。想象一下,如果我有100个不同的id但是相同的student_id,那么在学生表中。 student_id索引将被视为错误,* Teradata查询优化器将足够聪明,可以选择更好的分数或ID。 (如果使用Teradata DB,但大多数都内置了这样的智能功能)。肯定不会选择综合指数,因为为什么?我认为在这个表格案例中根本无法获取。选择一个好的索引的最好方法是问好哪个列可以为我提供一个价格低廉(整数)的唯一值,如果选择的话可以消除一个好的分区或数据块。但是,在这种情况下,student_id将是最好的索引。加上以“和得分&gt; y”结尾的查询会更快。始终首先看到Where子句,因此数据集将小得多。