首先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版本是否支持