ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

SQL优化

2022-09-15 15:31:41  阅读:247  来源: 互联网

标签:name union 优化 索引 user SQL where id


1、EXPLAIN

            查看SQL执行计划,重点关注下面三个字段

            1)type列,连接类型。一个好的SQL语句至少要达到range级别。杜绝出现all级别。

            2)key列,使用到的索引名。如果没有选择索引,值是NULL。可以采取强制索引方式。

             3)key_len列,索引长度。

2、SQL语句中IN包含的值不应过多

            例如:select id from t where num in(1,2,3) 对于连续的数值,能用between就不要用in了,如果数值较多,产生的消耗也是比较大的

3、SELECT语句务必指明字段名称

            不要查*,只查询所需要的字段

4、当只需要一条数据的时候,使用limit 1

5、如果排序字段没有用到索引,就尽量少排序

6、如果限制条件中其他字段没有索引,尽量少用or

           or两边的字段中,如果有一个不是索引字段,而其他条件也不是索引字段,会造成该查询不走索引的情况。很多时候使用union all或者是union(必要的时 候)的方式来代替“or”会得到更好的效果。

7、尽量用union all代替union

            union和union all的差异主要是前者需要将结果集合并后再进行唯一性过滤操作,这就会涉及到排序,增加大量的CPU运算,加大资源消耗及延迟。当然,union all的前提条件是两个结果集没有重复数据。

8、使用合理的分页方式以提高分页的效率

            select id,name from product limit 866613, 20可以优化成select id,name from product where id> 866612 limit 20

            优化的方法如下:可以取前一页的最大行数的id,然后根据这个最大的id来限制下一页的起点。比如此列中,上一页最大的id是866612。

9、分段查询

             在一些用户选择页面中,可能一些用户选择的时间范围过大,造成查询缓慢。主要的原因是扫描行数过多。这个时候可以通过程序,分段进行查询,循环遍历,将结果合并处理进行展示。

10、避免在where子句中对字段进行null值判断

             对于null的判断会导致引擎放弃使用索引而进行全表扫描

11、不建议使用%前缀模糊查询

           例如LIKE“%name”或者LIKE“%name%”,这种查询会导致索引失效而进行全表扫描。但是可以使用LIKE “name%”。

          使用全文索引可以解决LIKE“%name”或者LIKE“%name%”这个问题

          创建全文索引的SQL语法是:

          ALTER TABLE `dynamic_201606` ADD FULLTEXT INDEX `idx_user_name` (`user_name`);

         使用全文索引的SQL语句是:

         select id,fnum,fdst from dynamic_201606 where match(user_name) against(‘zhangsan’ in boolean mode);

        注意:在需要创建全文索引之前,请联系DBA确定能否创建。同时需要注意的是查询语句的写法与普通索引的区别。

12、避免在where子句中对字段进行表达式操作

        比如:

       select user_id,user_project from user_base where age*2=36;

       中对字段就行了算术运算,这会造成引擎放弃使用索引,建议改成:

       select user_id,user_project from user_base where age=36/2;

13、避免隐式类型转换

       where子句中出现column字段的类型和传入的参数类型不一致的时候发生的类型转换,建议先确定where中的参数类型。

14、对于联合索引来说,要遵守最左前缀法则

       举列来说索引含有字段id、name、school,可以直接用id字段,也可以id、name这样的顺序,但是name;school都无法使用这个索引。所以在创建联合索引的时候一定要注意索引字段顺序,常用的查询字段放在最前面。

15、关于JOIN优化

        尽量使用inner join,避免left join,因为参与联合查询的表至少为2张表,一般都存在大小之分。如果连接方式是inner join,在没有其他过滤条件的情况下MySQL会自动选择小表作为驱动表,但是left join在驱动表的选择上遵循的是左边驱动右边的原则,即left join左边的表名为驱动表,利用小表去驱动大表

标签:name,union,优化,索引,user,SQL,where,id
来源: https://www.cnblogs.com/ForeverLoveByMe/p/16696706.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有