目录
一.mysql逻辑架构,优化
1.1内置优化系统:
mysql中有内置的优化系统,比如开发者写查询语句关心的是select,但mysql底层优化组件会用自己的优化方式去解读sql语句,(比如从from开始)。mysql会把所有语句优化成自己认为最优的处理方式,这个过程需要时间(不多)但不一定是最符合项目的极端情况最优解,于是类似于alibaba这种公司把mysql的优化组件去掉,强制优化成完全符合自己业务逻辑的执行,而对于他们,mysql没有优化功能,只有执行功能.(只在极端业务场景下)
1.2 存储引擎
mysql有不下十种可拔插式存储引擎,打个比方,一辆越野车有不同的发动机,有的适合跑沙漠,有的适合跑城市,那么不同的发动机就类似于mysql的存储引擎,对于不同情况使用不同存储引擎可以将性能最大化。
了解三种
MyISAM
它不支持事务,也不支持外键,尤其是访问速度快,对事务完整性没有要求或者以SELECT、INSERT为主的应用基本都可以使用这个引擎来创建表。表锁,不适合高并发的操作.,只缓存索引,不缓存真实数据
InnoDB
InnoDB是一个健壮的事务型存储引擎,为用户操作非常大的数据存储提供了一个强大的解决方案。InnoDB就是作为大多数默认的存储引擎,支持事务,外键,行锁,适合高并发的操作,缓存真实数据,对硬件性能要求高,内存大小直接影响性能
Memory
为得到最快的响应时间,采用的逻辑存储介质是系统内存。虽然在内存中存储表数据确实会提供很高的性能,但数据都是暂时性的.他要求在Memory中存储的数据都是长度不可变的。所以BLOB和TEXT这样的长度可变的数据类型不能用.(VARCHAR可以,因为mysql底层认为VARCHAR是长度不可变的char)
二 sql优化前瞻
1.sql性能慢的原因
① sql写的烂 (包括各种子查询导致用不上索引,或者没建索引)
② 索引失效 (建了索引没用上)
③join太多
④服务器调优及参数设置
2.Mysql的sql执行加载顺序
FROM ➡ ON ➡ JOIN ➡ WHERE ➡ GROUP BY ➡ HAVING ➡ SELECT ➡ DISTINCT ➡ LIMIT
个人理解:条件>内容>内容处理
先加载条件 然后处理内容 最后处理内容集
三 索引
1.索引是什么
在数据之外,数据库还维护着一种满足特性查找算法的数据结构,这种数据结构引用或指向数据,这样就可以在数据结构上快速的查找到想要的数据,这种数据结构就是索引 . 所以 ,什么是索引?
答:※※※※: 排好序的快速查找数据结构
理解:1.查找快 2 排好序 3 数据结构
索引会影响sql where后面的条件和查找的内容 这个后文会详细记录
tips:1.如果没特殊说明,索引都是btree索引
2.业务的逻辑删除很多也是为了维护索引
3.索引以数据结构的形式存储在硬盘中
2.索引的好处
1.类似于图书馆书籍建立索引,提高检索效率,降低数据库IO成本
2.通过索引对数据进行排序,降低了排序成本,减少CPU消耗
tips:快速查找的数据结构 : 排序 查找
3.索引的缺点
1.索引也是一张表 ,也要占用空间
2.虽然增加了查找速度,但是在更新表的操作中,不光要维护数据,还要维护索引列
3.建立索引肯定不是一次性建好的,是通过不断的完善更新出最优的索引
4.索引的分类
1.单值索引 :一个索引只包含单列,一个表可以有多个单值索引
2.唯一索引 :索引列的值必须唯一,可以为空
3.复合索引: 一个索引包含多个列
5 建立索引的条件
1.主键自动建立唯一索引
2.频繁作为查询条件的字段应建立索引
3.查询中和其他表相关联的字段,外键应建立索引
4.频繁更新的字段/表 不适合建立索引
5.where 条件中用不到的字段不适合建立索引
6.单键和组合索引中建议建立组合索引
7.查询中排序的字段,如果通过索引去访问,将大大提高效率
8.分组字段应建立索引(分组和排序在后文会详细介绍)
9.表记录太少不适合建立索引
10.一个字段如果包含过多的重复数据,不适合建立索引 例如(性别、国籍)
tips:在mysql底层 分组必排序 所以分组和排序都建议建立索引