高并发数据库之MySql性能优化实战总结

时间:2022-09-08 14:00:29

向MySQL发送一个请求时MySQL具体的操作过程

高并发数据库之MySql性能优化实战总结

 

慢查询

1.慢查询

SHOW  VARIABLES LIKE '%quer%'

高并发数据库之MySql性能优化实战总结

索引优化技巧

1.对于创建的多列索引(复合)索引,只要查询条件使用了最左边的列,索引一般就会被使用。

2.对于使用like的查询,查询如果是“%aaa”、“_aaa”就不会使用索引,“aaa%”就会使用索引。

3.如果条件中有or,则要求or的所有字段都必须有索引,否则不能使用索引。

4.如果列类型是字符串,则一定要在条件中将数据使用引号引起来,否则不使用索引。

5如果全表扫描比索引快,则不使用索引。

6.优化group by语句

    默认情况下mysql对所有的group by进行排序

EXPLAIN  SELECT * FROM USER WHERE username='jxzz' GROUP BY creattime

高并发数据库之MySql性能优化实战总结

    如果查询中包含group by,但用户想避免排序结果的消耗,则可以使用ORDER BY NULL禁止排序

EXPLAIN  SELECT * FROM USER WHERE username='jxzz' GROUP BY creattime ORDER BY NULL

 高并发数据库之MySql性能优化实战总结

7.尽量用连接查询代替子查询。因为子查询会在内存中创建临时表。而join是不需要在内存中创建临时表。

8.用 exists 代替 in

    很多时候用 exists 代替 in 是一个好的选择:

    select num from a where num in(select num from b)

    用下面的语句替换:

    select num from a where exists(select 1 from b where num=a.num)

9.使用 varchar/nvarchar 代替 char/nchar

    尽可能的使用 varchar/nvarchar 代替 char/nchar ,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。

10.能用DISTINCT的就不用GROUP BY

    SELECT OrderID FROM Details WHERE UnitPrice > 10 GROUP BY OrderID

    可改为:

    SELECT DISTINCT OrderID FROM Details WHERE UnitPrice > 10

11.能用UNION ALL就不要用UNION

    UNION ALL不执行SELECT DISTINCT函数,这样就会减少很多不必要的资源。

 查询索引的使用情况

命令

SHOW STATUS LIKE 'handler_read%'

高并发数据库之MySql性能优化实战总结