文章目录
- 1.在MySQL中如何定位慢查询
- 2.SQL语句执行很慢,如何分析
- 3.什么是索引
- 4.索引的底层结构了解过嘛
- 5.B树和B+树的区别是什么
- 6.什么是聚簇索引什么是非聚簇索引
- 7.什么是回表查询
- 8.什么是覆盖索引
- 9.MySQL超大分页如何处理
- 10.索引创建原则有哪些
- 11.什么情况下索引会失效
- 12.对sql优化的经验
- 表的设计优化
- SQL语句优化
1.在MySQL中如何定位慢查询
- 采用运维的监控系统Skywalking,可以监测出哪个接口,最终因为是sql的问题
- 在mysql中开启慢查询日志,我们设置的值是2秒,一旦sql执行超过2秒就会记录到日志中(调试阶段)
开启MySQL慢日志查询开关
slow_query_log=1
设置慢日志的时间为2秒,SQL语句执行时间超过2秒,就会视为慢查询,记录慢查询日志
long_query_time=1
2.SQL语句执行很慢,如何分析
可以采用MySQL自带的分析工具explain来去查看这条sql的执行情况
● 通过key和key_len检查是否命中了索引(索引本身存在是否有失效的可能)
● 通过type字段查看sql是否有进一步的优化空间,是否存在全索引扫描或全盘扫描
● 通过extra建议判断,是否出现了回表的情况,如果出现了,可以尝试添加索引或修改返回字段来修复
3.什么是索引
● 索引是帮助MySQL高效获取数据的数据结构(有序)
● 提高数据检索的效率,降低数据库的IO成本(不需要全表扫描)
● 通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗
4.索引的底层结构了解过嘛
● MySQL默认的存储引擎InnoDB采用的B+树来存储索引
● B+树阶数更多,路径更短
● 磁盘读写代价B+树更低,非叶子节点只存储指针,叶子阶段存储数据
● B+树偏于扫库和区间查询,叶子节点是一个双向链表
5.B树和B+树的区别是什么
● 在B树中,非叶子节点和叶子节点都会存放数据,而B+树的所有数据都会出席那在叶子节点中,在查询的时候,B+树查找效率更加稳定
● 在进行范围查询的时候,B+树效率更高,因为B+树都在叶子节点存储,而且叶子节点是一个双向链表
6.什么是聚簇索引什么是非聚簇索引
● 聚簇索引(聚集索引):数据与索引放到一块,B+树的叶子节点保存了整行数据,有且只有一个
● 非聚簇索引(二级索引):数据与索引分开存储,B+树的叶子节点保存对应的主键,可以有多个
7.什么是回表查询
通过二级索引找多对应的主键值,到聚簇索引中查找整行数据,这个过程就是回表
8.什么是覆盖索引
覆盖索引是指查询使用了索引,返回的列,必须在索引中全部被找到
● 使用id查询,直接走聚集索引查询,一次索引扫描,直接返回数据,性能高
● 如果返回的列中没有创建索引,有可能会触发回表查询,尽量避免使用select *
9.MySQL超大分页如何处理
问题:在数据量比较大时,limit分页查询,需要对数据进行排序,效率低
解决方案:覆盖索引+子查询
select * from tb_sku limit 9000000,10
这条sql语句可以优化为
select * from tb_sku t,(select id from tb_sku order by id limit 9000000,10) a where t.id = a.id
10.索引创建原则有哪些
- 数据量较大(超过10万以上),且查询比较频繁的表
- 常作为查询条件、排序、分组的字段
- 字段内容区分度高
- 内容较长,使用前缀索引
- 尽量联合索引
- 要控制索引的数量
- 如果索引列不能存储NULL值,请在创建表时使用NOT NULL约束它
11.什么情况下索引会失效
- 违反最左前缀法则
- 范围查询右边的列,不能使用索引
- 不要在索引列上进行运算操作,索引将失效
- 字符串不加单引号,造成索引失效。(类型转换)
- 以%开头的Like模糊查询,索引失效
12.对sql优化的经验
表的设计优化
- 比如设置合适的数值(tinint int bigint),要根据实际情况选择
- 比如设置合适的字符串类型(char和varchar)char定长效率高,varchar可变长度,效率稍低
SQL语句优化
- select语句务必指明字段名称(避免直接使用select *)
- SQL语句要避免照成索引失效的写法
- 尽量用union all代替union ,union会多一次过滤,效率低
- 避免在where子句中对字段进行表达式操作
- Join优化 能用innerjoin就不用left join right join,如必须使用 一定要以小表为驱动
内连接会对两个表进行优化,优先把小表放在外边,把大表放在里边。但left join和right join,不会重新调整顺序