- 1.影响性能的相关因素
1. 产品经理不合理的需求-占用太多资源
2. 系统架构落后,业务发展快的时候出现瓶颈
3. sql语句里面写复杂的业务逻辑
4. 数据库存照片音频-io很吃性能
5. 表设计不当- 实体字段有查询多的,修改多的,应该拆开2个实体,如果查询多的是用户基本信息字段,就会影响到用户登录。
6. 服务器硬件
7. 查询sql语句没有用到索引?
-
2.针对查询SQL进行详细分析
引擎区别
什么是索引?
它是有序的,本质是数据结构,放在磁盘,独立于数据库之外。
索引类型分类?
B树用于文件系统,mongodb
MySQL索引实现?
都有data区,主索引放全部数据,辅助索引放主键id
什么是聚簇索引?
聚集索引是指数据库表行中数据的物理顺序与键值的逻辑(索引)顺序相同。
通俗讲:
聚簇索引:将数据存储与索引放到了一块,找到索引也就找到了数据
非聚簇索引:将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应
InnoDB 聚集索引 的叶子节点存储行记录,因此,InnoDB 必须要有,且只有一个聚集索引
如果表定义了主键,则主键就是聚集索引;
如果表没有定义主键,则第一个 not null 的 unique 列是聚集索引;
否则,InnoDB 会创建一个隐藏的 row-id 作为聚集索引;
注意:所以主键查询非常快,直接定位行记录。
如何创建索引?
1,较频繁的作为查询条件的字段应该创建索引;
2,唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件(因为索引选择性会远小于1);
3,更新非常频繁的字段不适合创建索引;
4,不会出现在WHERE 子句中的字段不该创建索引;
SQL调优建议?
第一个是SQL的查询一定要基于索引来进行数据扫描。
第二个避免索引列上使用函数或者运算符,这样会导致索引失效。
第三个,where查询条件的like一定要把%放在右侧。
第四个是用索引扫描,联合索引中的列,从左到右命中的越多越好。
第五个,尽可能使用SQL语句用到的索引来完成排序,避免使用文件排序的方式。
第六个查询语句里面我们尽量少用*号,而是用具体有效的列来代替。
最后一个啊,永远要用小的结果集去驱动最大的结果集。
性能分析命令?
1.Explain
sql执行计划,可以看到sql的全部操作,比如说有没有用到索引。
2.SHOW PROFILES;
可分析sql之间的执行时间
为什么索引没有使用二叉查找树实现?
有极端性,不能自平衡,会变成链表
b树和b+树和阶有关,阶和节点存放元素有关(n阶 =存放n-1个元素)
阶越高,树越矮胖,搜索性能越高
每读取一个节点就是一次磁盘io,(耗性能)
每个节点内的元素有序,通过二分查找
B树 (n阶=n子节点)?
B-树和B+树区别?
B-树 读 B树,可不能读B减数了!!!
回表,索引的覆盖,辅助索引null以及重复值处理?
最左原则?
看sql语句的where后面的第一个条件。
如果where后面的第一个条件和创建索引的第一个名字不一样,则不符合最左原则。