别再说你不懂MySQL了!

  • 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后面的第一个条件和创建索引的第一个名字不一样,则不符合最左原则。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容