MySQL优化实例

摘要:
1、 解释解释select*fromt_执行命令后,将打印类型:alltype具有all(全表扫描)index(全索引扫描)range(索引范围扫描)ref(非唯一索引扫描或唯一索引的前缀扫描)eq_ref(唯一索引扫描)const,system(主键或唯一索引查询)null(MySQL可以在不访问表的情况下从dualhere1获得结果select1)
一、explain
explain select * from t_order
MySQL优化实例第1张

 

执行后会打印type:all
type有 all(全表扫描) index(索引全扫描) range(索引范围扫描) ref(非唯一索引扫描或唯一索引的前缀扫描) eq_ref(唯一索引扫描) const,system(主键或唯一索引unique index查询) null(mysql不用访问表就能得到结果 select 1 from dual where 1)
从左往后 性能由最差到最好;下面以索引失效的场景为例分析索引命中
 1、创建普通索引CREATE INDEX idx_userid ON t_order(user_id);
MySQL优化实例第2张

MySQL优化实例第3张

由于user_id是varchar类型,所以当user_id作为搜索条件时,需要带上双引号,不带的话会导致索引失效

2、通配符Like查询%最左侧导致索引失效

MySQL优化实例第4张

MySQL优化实例第5张

3、使用!=、>、<导致索引失效

MySQL优化实例第6张

MySQL优化实例第7张

4、对于组合索引,OR查询将会失效;删除之前创建的索引,添加个组合索引CREATE INDEX idx_u_p ON t_order(user_id,pay_mode); 其中pay_mode是tinyint类型

MySQL优化实例第8张

MySQL优化实例第9张

使用OR之后索引变失效了,要想同时用OR查询和索引失效,需要单独创建user_id和pay_mode索引

5、对于组合索引,不是使用的第一部分则不会使用索引(需参考场景4中创建索引的语句,user_id在pay_mode之前)

MySQL优化实例第10张

MySQL优化实例第11张

由图可知,user_id触发了索引,但是pay_mode没有触发索引

 

二、profile
1.查看profile和开启
MySQL优化实例第12张
 
MySQL优化实例第13张
2.通过profile查看不同存储引擎执行sql的差别以及每个线程消耗的时间,假设查询的id=7
set @query_id :=7;
select state,sum(duration) as Total_R, ROUND( 100 * SUM(duration) / (select sum(duration) from INFORMATION__SCHEMA.PROFILING WHERE QUERY_ID = @query_id ),2) as Pct_R, count(*) as Calls, sum(DURATION) / COUNT(*) as "r/Call" FROM INFORMATION_SCHEMA.PROFILING where query_id = @query_id group by state order by Total_R desc;
MySQL优化实例第14张
InnoDB存储引擎下存在Sending data,有访问数据的过程
MySQL优化实例第15张
MyIsam下在executing之后直接结束查询,完全不需要访问数据
MySQL优化实例第16张
三、通过trace分析优化器如何选择执行计划
1.开启trace 设置格式为JSON
MySQL优化实例第17张
2.设置trace最大能够使用的内存大小,避免解析过程中因为默认内存过小而不能够完整显示
MySQL优化实例第18张
3.执行sql语句 查看mysql是如何执行sql
MySQL优化实例第19张
四、索引问题
1.索引的存储分类,索引是在存储引擎层中实现的
①B-Tree索引:最常见的索引类型,大部分引擎都支持B树索引
②HASH索引:只有memory引擎支持,使用场景简单
③R-Tree索引(空间索引):是MyISAM的一个特殊索引类型,主要用于地理空间数据类型,使用较少
④Full-text(全文索引):是MyISAM的一个特殊索引类型,主要用于全文索引,InnoDB从MYSQL5.6开始提供对全文索引的支持
2.索引的典型场景 索引m(列a,列b,列c)
①匹配全值 a=1 and b=1 and c=1 用到了索引m 类型为const
②匹配值的范围查询 c>=1 and c<100 没有用到索引m 类型为range
③匹配最左前缀 b=1 and c=1 不会用到索引m;a=1 and c=1 会用到索引m
④仅仅对索引进行查询(Index only query),当查询的列都在索引的字段中时,查询的效率更高 select a from table where a=1 类型为ref
⑤匹配列前缀 仅仅使用索引中的第一列,并且只包含索引第一列的开头一部分进行查找
create index idx_title_desc_part on filem_text(title(10),description(20))
select title from film_text where title like 'AFRICAN% '
3.存在索引但不能使用索引的典型场景
①以%开头的like查询不能使用B-Tree索引
五、数据备份
mysqldump -uroot -p -l -F sakila(库名) > /usr/local/mysql/backup/sakila-20170730.sql(备份后的文件地址)

免责声明:文章转载自《MySQL优化实例》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Ubuntu + pip + Python3 + CPU版本 PaddlePaddle 安装Linux进程间通信-信号量下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

python3 + Django + Mysql + Vue + Element-UI 学习笔记:从0搭建前后端分离的测试工具平台

2020.03.23  INIT 中间换了工作,好久没写了 2021.05.08  新增:页面预览、功能实现样例(含后端接口、前端页面、配置绑定) 2021.05.13  新增:首页增加访问人数统计功能 2021.05.19  新增:用户信息查询接口、页面开发 2021.06.10  新增:生成图片功能 2021.06.18  新增:文本处理工具下载页面...

The account is locked

SQL> select * from v$version where rownum=1; BANNER -------------------------------------------------------------------------------- Oracle Database 11g Enterprise Edition Rel...

10 : mysql 主从复制

延时从库 主从复制很好的解决了物理损坏,但是如果主库有个误删除写入的操作怎么办? 正常情况下从库也会同步这个错误的,企业中应该怎么避免这个情况?这个时候就需要使用延时同步来解决: 延时从库?delay(延时)从节点同步数据。 对SQL线程进行延时设置。IO线程正常的执行。企业中一般延迟3-6小时 延时从库的配置过程:mysql>stop slave;...

【SQL server初级】数据库性能优化二:数据库表优化

数据库优化包含以下三部分,数据库自身的优化,数据库表优化,程序操作优化.此文为第二部分   数据库性能优化二:数据库表优化   优化①:设计规范化表,消除数据冗余   数据库范式是确保数据库结构合理,满足各种查询需要、避免数据库操作异常的数据库设计方式。满足范式要求的表,称为规范化表,范式产生于20世纪70年代初,一般表设计满足前三范式就可以,在这里简单...

ubuntu apt 安装mysql 5.7

Ubuntu上安装MySQL非常简单只需要几条命令就可以完成。 1. sudo apt-get install mysql-server 2. apt-get isntall mysql-client 3. sudo apt-get install libmysqlclient-dev 安装过程中会提示设置密码什么的,注意设置了不要忘了,安装完成之后可以使...

ORACLE实例恢复过程详细分析--使用dump、BBED等多种工具结合分析

---友情提示,内容较多,可以从博文左上的+目录选择小节方便阅读。  实验思路:  --实验相关TRACE文件:http://download.csdn.net/detail/q947817003/6646723 1.数据库OPEN,,做DML操作不提交,查看检查点。 2.SHUTDOWN ABORT并重启到MOUNT并查询检查点 3....