最近优化MySQL数据库查询过程中,发现集中的性能问题主要在以下几个方面
1,limit条件数太大
实例:select * from test008 limit 10000000,10;
关注点:limit 10000000,10
这类问题的解决方案可从两方面入手,一是考虑功能是否可以优化,查询这样一条数据所消耗的成本与带来的效果是不是值的,二是考虑采用主键进行关系运算符,如id>10000000,但结果可能存在误差。
2,强制索引使用问题
实例:select * from test008 force index(xxidx) where key1 = xx And key2 = xx order by key3 desc limit 10;
实例:select * from test008 limit 10000000,10;
关注点:limit 10000000,10
这类问题的解决方案可从两方面入手,一是考虑功能是否可以优化,查询这样一条数据所消耗的成本与带来的效果是不是值的,二是考虑采用主键进行关系运算符,如id>10000000,但结果可能存在误差。
2,强制索引使用问题
实例:select * from test008 force index(xxidx) where key1 = xx And key2 = xx order by key3 desc limit 10;
关注点:force index(xxidx)
这类问题是为了解决效率问题而产生的新的效率问题,在使用的过程中关键要搞清MySQL根椐条件查询选择的索引与强制索引消耗资源和问题,根椐实际情况指定索引。
3,文件排序的合理性依据
实例:select * from test008 where key1 = xx And key2 = xx order by key3 desc limit 10;
这类问题是为了解决效率问题而产生的新的效率问题,在使用的过程中关键要搞清MySQL根椐条件查询选择的索引与强制索引消耗资源和问题,根椐实际情况指定索引。
3,文件排序的合理性依据
实例:select * from test008 where key1 = xx And key2 = xx order by key3 desc limit 10;
关注点:order by key3 desc
这类问题产生的原因是有索引但采用了文件排序,MySQL自动选择了key1或key2关联字段的索引,如果产生的结果集很小,但使用key2或key3的条件过滤结果集很大,可忽视文件排序。
4,条件查询中IN条件与order by排序同时存在
实例:select * from test008 where key1 in(x1,x2,x3) And key2 = xx order by key3 desc limit 10;
这类问题产生的原因是有索引但采用了文件排序,MySQL自动选择了key1或key2关联字段的索引,如果产生的结果集很小,但使用key2或key3的条件过滤结果集很大,可忽视文件排序。
4,条件查询中IN条件与order by排序同时存在
实例:select * from test008 where key1 in(x1,x2,x3) And key2 = xx order by key3 desc limit 10;
关注点: key1 in(x1,x2,x3) 与 order by key3 desc
这类问题是order by 与 in 组合查询不能走索引产生,如果key1过滤的结果集很大可优先考虑order by。
继续优化MySQL效率问题,不管分析对错与否,实践检验一切。
实践是一个过程,记录是一种方式,无数个思考的点滴托起
