WEB开发网
开发学院数据库MySQL Schema的优化和索引 - 学习一个索引示例 阅读

Schema的优化和索引 - 学习一个索引示例

 2009-09-02 00:00:00 来源:WEB开发网   
核心提示: 现在你可能会发现,我们创建索引的时候总是把age列放到最后,Schema的优化和索引 - 学习一个索引示例(3),这个列有啥不同么,为什么要放到最后?我们要尽可能使MySQL是用索引上所有的列,如果组合变得过大,新的MySQL版本会停止评估这些组合 ,因为只能使用最左端的前缀,直到发现第一个条件

现在你可能会发现,我们创建索引的时候总是把age列放到最后。这个列有啥不同么,为什么要放到最后?我们要尽可能使MySQL是用索引上所有的列,因为只能使用最左端的前缀,直到发现第一个条件为范围查询为止。我们已经提到的其他列在WHERE中都可以用相等的条件,但是age的条件是个范围(比如18-25之间)。

我们也可以转为IN()列表。如age IN(18, 19, 20, 21, 22, 23, 24, 25),但是这种方法并不适合这个类型的查询。我们举例要说明的一般准则就是把范围条件的列放到索引的最后,因此优化器就会尽可能使用索引。

我们已经说过了你可以添加更多的列到索引中并且使用IN()列表覆盖那些并不是WHERE条件一部分的那些列,但是你可能做的过了头就会导致问题的发生。在IN中使用了过多的值,是这些list的组合变得巨大,优化器就要评估这种情况了,并且,这样也会降低查询的速度。考虑下如下的语句:

WHERE eye_color IN('brown','blue','hazel')

AND hair_color IN('black','red','blonde','brown')

AND sex IN('M','F')

优化器会把这些转换为3*4*2组合,并且WHERE条件必须要对每一个进行校验。24个组合并不是很极端的数字。但是如果这个数字变为上千的话就要小心了。旧的MySQL版本在处理大量IN组合的时候会出现很多问题:查询优化器会用很多事前和消耗很多内存。如果组合变得过大,新的MySQL版本会停止评估这些组合 ,但是仍会限制MySQL使用索引。

避免使用多个范围查询

假设我们有个last_online列并且我们的需求是上个星期哪些用户在线:

WHERE eye_color IN('brown','blue','hazel')
AND hair_color IN('black','red','blonde','brown')
AND sex IN('M','F')
AND last_online > DATE_SUB('2008-01-17', INTERVAL 7 DAY)
AND age BETWEEN 18 AND 25

上一页  1 2 3 4 5  下一页

Tags:Schema 优化 索引

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接