实践中如何优化MySQL

① SQL语句及索引的优化

SQL语句的优化:

1、尽量避免使用子查询

2、避免函数索引

3、用IN来替换OR

4、LIKE前缀%号、双百分号、_下划线查询非索引列或*无法使用到索引,如果查询的是索引列则可以

5、读取适当的记录LIMIT M,N,而不要读多余的记录

6、避免数据类型不一致

7、分组统计可以禁止排序sort,总和查询可以禁止排重用union all

8、避免随机取记录

9、禁止不必要的ORDER BY排序

10、批量INSERT插入

11、不要使用NOT等负向查询条件

你可以想象一下,对于一棵B+树,根节点是40,如果你的条件是等于20,就去左面查,你的条件等于50,就去右面查,但是你的条件是不等于66,索引应该咋办?还不是遍历一遍才知道。

 

索引的优化:

1、Join语句的优化

尽可能减少Join语句中的NestedLoop的循环次数:“永远用小结果集驱动大的结果集”

(Join左连接在右边建立索引;组合索引则尽量将数据量大的放在左边,在左边建立索引)

2、避免索引失效

1.最佳左前缀法则

       如果索引了多列,要遵守最左前缀法则,指的是查询从索引的最左前列开始并且不跳过索引中的列。Mysql查询优化器会对查询的字段进行改进,判断查询的字段以哪种形式组合能使得查询更快,所有比如创建的是(a,b)索引,查询的是(b,a),查询优化器会修改成(a,b)后使用索引查询。

2.不在索引列上做任何操作

       (计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描。

3.存储引擎不能使用索引中范围条件右边的列。

        如这样的sql: select * from user where username='123' and age>20 and phone='1390012345',其中username, age, phone都有索引,只有username和age会生效,phone的索引没有用到。

4.尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致))

       如select age from user减少select *

5.mysql在使用不等于(!= 或者 <>)的时候无法使用索引会导致全表扫描。

6.is null, is not null 也无法使用索引,在实际中尽量不要使用null。

7.like 以通配符开头(‘%abc..’)mysql索引失效会变成全表扫描的操作。

       所以最好用右边like 'abc%'。如果两边都要用,可以用select age from user where username like '%abc%',其中age是必须是索引列,才可让索引生效

        假如index(a,b,c), where a=3 and b like 'abc%' and c=4,a能用,b能用,c不能用,类似于不能使用范围条件右边的列的索引

       对于一棵B+树来讲,如果根是字符def,如果通配符在后面,例如abc%,则应该搜索左面,例如efg%,则应该搜索右面,如果通配符在前面%abc,则不知道应该走哪一面,还是都扫描一遍吧。

8.字符串不加单引号索引失效

9.少用or,用它来连接时会索引失效

10.尽量避免子查询,而用join

11、在组合索引中,将有区分度的索引放在前面

       如果没有区分度,例如用性别,相当于把整个大表分成两部分,查找数据还是需要遍历半个表才能找到,使得索引失去了意义。

 

② 数据库表结构的优化:使得数据库结构符合三大范式与BCNF

③ 系统配置的优化

④ 硬件的优化

参考链接:

https://www.zhihu.com/question/36996520

http://liucw.cn/2018/01/07/mysql/%E7%B4%A2%E5%BC%95%E4%BC%98%E5%8C%96%E5%88%86%E6%9E%90/

猜你喜欢

转载自blog.csdn.net/qq_35642036/article/details/82820129