性能优化之MySQL(Structured Query Languag)

匿名 (未验证) 提交于 2019-12-02 22:06:11

首先mysql结构图


ODBC。

   Management Serveices & Utilities:系统管理和控制工具集合,例如备份还原,安全复制等功能。

   Connection Pool:连接池,用于管理缓冲用户连接,线程处理等需要缓存的需求。

from就是调用SQL Interface。

   Parser:解析器,用于SQL命令传递到解析器的时候会被解析器验证和解析。解析器是由Lex和YACC实现的,是一个很长的脚本。

   Optimizer:查询优化器,用于SQL语句在查询之前会使用查询优化器对查询进行优化。他使用的是“选取-投影-联接”策略进行查询。

   Cache和Buffer:查询缓存,如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等。

   Engine:存储引擎,存储引擎是MySql中具体的与文件打交道的子系统。也是Mysql最具有特色的一个地方。Mysql的存储引擎是插件式的。它根据MySql提供的文件访问层的一个抽象接口来定制一种文件访问机制(这种访问机制就叫存储引擎)。现在有很多种存储引擎,各个存储引擎的优势各不一样,最常用的MyISAM,InnoDB,BDB

SQL执行顺序:

MyISAM,InnoDB区别:


一、慢查询的开启与捕获

log_output 参数是指定日志的存储方式。log_output='FILE'表示将日志存入文件,默认值是'FILE'。log_output='TABLE'表示将日志存入数据库,这样日志信息就会被写入到mysql.slow_log表中。

SHOW GLOBAL VARIABLES LIKE '%slow_query_log%' //查看是否开启



SHOW VARIABLES LIKE '%log_queries_not_using_indexes%' //查看sql未使用索引的查询


SET GLOBAL slow_query_log=1 //开启慢查询日志,mysql默认是关闭的,用到的时候再打开,用完及时关闭。



slow_query_log_file = /mysqldata/log/slow-query.log // 慢查询日志存放路径 默认为 hostname-slow.log

log_output='FILE'

利用mysqldumpslow日志分析工具


g:后边搭配一个正则表达式,大小写不敏感

例子:

得到返回记录集最多的10条sql

得到访问次数最多的10条sql


得到按照时间 排序的前10条里面包含有左连接的查询语句


另外使用这些命令时结合| 和more使用,否则可能出现爆屏情况。


二、explan+慢SQL分析

explan+sql 能够分析出:


id:table的读取顺。从高到低依次读取。

SUBQUERY 子

table:查询的表

type : 分析sql性能的重要参数。性能优越性依次为 system>const>eq_ref>ref>range>index>all。

possibe_keys :可能用到的key

key:实际用到的key

ref : 查询索引用到的值

rows : 该表多少行被优化器查询

extra : 存储一些重要的信息。Using filesort 文件排序(一般order by.会遇到需优化),Using temporary(会自动创建临时表,必须优化), Using index(用到了索引。说明这个sql性能良好),Using join buffer(多个join下会存在,用多了查询缓存).......

sql语句编写规则:

1、全值匹配

2、最佳左前缀法则:如果索引了多个列,查询应该从索引的最左前列开始且不跳过索引中的列

3、不在索引上做任何操作(计算、函数、类型转换等),会导致索引失效而转向全表扫描

4、存储引擎不能使用索引范围条件右边的列

5、尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),减少select*

6、mysql在使用不等于(!= 或者 <>)的时候会使索引失效,导致全表扫描

7、is null,is not null 也无法使用索引

8、like 以通配符开头 (‘%aaa’)mysql索引会失效导致全表扫描。不是这种 like 'aaa%'

9、字符串不加单引号索引也会失效

11、提高order by 速度。尝试提高 sort_buffer_size,提高 max_length_for_sort_data



三、show profile

1、首先确认,现在mysql版本是否支持



易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!