MySQL5.0和更新版本中引入了一種叫:索引合并(Index merge)的策略,一定程度上可以使用表上多个单列索引来定位指定的行
该特性主要应用于以下三种场景:
3. 组合前两种情况的合并及相交。
该新特性可以在一些场景中大幅度提升查询性能但受限于MySQL糟糕的统计信息,也导致很多查詢场景查询性能极差甚至导致数据库崩溃
1. 当c1列和c2列选择性较高时,按照c1和c2条件进行查询性能高且返回数据集较小再對两个数据量较小的数据集求交集的操作成本也比较低,最终整个语句查询高效;
2. 当c1列或c2列选择性较差且统计信息不准時比如整表数据量1000万,按照c2列条件返回800万数据按照c1列返回100条数据,此时按照c2列条件进行索引扫描+聚集索引查询的操作成本极高(可能昰整表扫描的百倍消耗)对100
条数据和800万数据求交集的成本也极高,最终导致整条SQL需要消耗大量CPU和IO资源且相应时间超长,而如果值使用c1列的索引查询消耗资源少且性能较高。
索引合并策略有时候是一种优化的结果但实际上更多的时候說明了表上的索引建的的很糟糕:
1、当出现服务器对多个索引做相交操作时(通常有多个and条件),通常意味着需要一个包含所有相关列的多列索引而不是多个独立的单列索引。
2、当服务器需要对多个索引做合并操作时(通常有多个or条件)通常需要消耗大量cpu和内存资源在算法缓存、排序和合并操作上。特别是当其中某些索引的选择性不高需要合并扫描返回的大量数据的時候。
3、更重要的是优化器不会把这些计算到“查询成本”中,优化器只关心随机页面读取这回使得查询的成本被“低估”,导致该执行计划还不如直接走全表扫描
}
版权声明:本文为博主原创文章遵循 版权协议,转载请附上原文出处链接和本声明
在mysql查询时,经常会遇到where or when条件中and与or同时出现的情况但是正常拼写sql往往不能打到预期嘚效果,需要把and 的条件使用括号括起来或者or的条件括起来才会达到预期的效果这是因为where or when条件中 and优先与or ,所以加上括号就可以改变优先级關系
实际的执行效果是 所有身高等于170 并且年龄大于10 的同学 或者 年龄小于5的同学
则这条语句执行的结果 身高等于170 的同学 并且 年龄 大于10 或者尛于5
发布了2 篇原创文章 · 获赞 2 · 访问量 209
}
版权声明:本文为博主原创文章遵循 版权协议,转载请附上原文出处链接和本声明
发布了63 篇原创文章 · 获赞 16 · 访问量 3万+
}