问题1:如何定位Mysql慢查询?
分析:聚合查询、多表查询、表数据量过大、深度分页查询,导致页面加载慢、接口压测响应时间超过1s。
答:A使用开源运维工具,比如Arthas、SkyWalking;B使用Mysql自带的慢查询日志,调试阶段使用;
问题2:SQL执行慢,是如何分析优化的呢?
聚合查询,加临时表
多表查询,优化sql语句
表数据量过大,添加索引
深度分页查询,
通过执行计划来分析,EXPLAIN / DESC命令来查看执行计划
说下Mysql数据库的索引,什么是索引?
索引(index)是帮助MySQL高效获取数据的数据结构(有序)
提高数据检索的效率,降低数据库的IO成本(不需要全表扫描)
通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗
说下索引的底层数据结构?
MySQL的InnoDB引擎采用的B+树的数据结构来存储索引
阶数更多,路径更短
磁盘读写代价B+树更低,非叶子节点只存储指针,叶子阶段存储数据
B+树便于扫库和区间查询,叶子节点是一个双向链表
对比数据结构(二叉树、红黑树、B树、B+树)
样么是聚族索引件么是非聚族索引?
聚簇索引(聚集索引):数据与索引放到一块,B+的叶子节点保存了整行数据,有且只有一个。
聚集索引选取规则:
如果存在主键,主键索引就是聚集索引。
如果不存在主键,将使用第一个唯一 (UNIQUE) 索引作为聚集索引。Y
如果表没有主键,或没有合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚集索引。
非聚簇索引(二级索引):数据与索引分开存储,B+树的叶子节点保存对应的主键,可以有多个
知道什么是回表查询嘛?
通过二级索引找到对应的主键值,到聚集索引中查找整行数据,这个过程就是回表
select * from user where name = Arm';//name有索引,先走二级查询找到主键,再走一级索引。
知道什么叫覆盖索引嘛 ?
覆盖索引是指查询使用了索引,返回的列,必须在索引中全部能够找到
优化方案:使用主键id查询,直接走聚集索引查询,一次索引扫描,直接返回数据,性能高。如果返回的列中没有创建索引,有可能会触发回表查询,尽量避免使用select*
MYSQL超大分页怎么处理?
问题:在数据量比较大时,limit分页查询,需要对数据进行排序,效率低解决方案:覆盖索引+子查询
select * from tb sku t, (select id from tb sku order by id limit 9000000,10) a
where t.id = a.id;
索引创建原则有哪些?
1).数据量较大比如10+,且查询比较频繁的表 重要
2)常作为查询条件where、排序order by、分组group by的字段 重要
3).字段内容区分度高
4).内容较长,使用前缀索引
5)减少单列索引,尽量联合索引,很多时候可以成为覆盖索引,避免回表查询提高效率 重要
6)要控制索引的数量,越多维护索引结构代价就大,增删改效率差 重要
7)如果索引列不能存储NULL值,请在创建表时使用NOT NULL约束它
什么情况下索引会失效? 通常指的是联合索引失效问题
违反最左前缀法则
范围查询右边的列,不能使用索引
不要在索引列上进行运算操作,索引将失效
字符串不加单引号,造成索引失效。(类型转换)
以%开头的Like模糊查询,索引失效
谈一谈你对sql的优化的经验
表的设计优化,数据类型的选择
索引优化,索引创建原则
sql语句优化,避免索引失效,避免使用select* ....
主从复制、读写分离,不让数据的写入,影响读操作
分库分表
标签:数据库,查询,索引,Mysql,id,主键,select From: https://www.cnblogs.com/wycnblogs/p/17639634.html