MySQL优化
MySQL优化
总结:避免做全表查询!
1.尽量使用varchar类型数据存储字符,少使用char类型的数据
2.避免使用 select *
的全表查询,根据所需字段,进行索引
3.尽量不要在where子句的右边进行计算(表达式计算),会导致放弃索引,进行全表查询。比如:select id from t where num=num/2
4.尽量不使用IN 或者 not In 进行检索,否则也是进行全表查询
5.避免在where子句中使用 !=
或者<>
操作符,否则又去全表查询
6.避免在where子句中对字段进行函数操作
7.避免使用在where中使用or
进行拼接索引,否则也是全表查询。可以使用union all
8.尽量不要使用Like
查询,要是想提高,可以采用全文索引
MySQL常用存储引擎
- InnoDB引擎
1.事务安全的
2.支持外键、外键约束、行级锁机制
3.支持全文索引
4.InnoDB是行锁
- MyISAM引擎
1.MySQL 5.5以前默认的存储引擎
2.分为静态MyISAM、动态MyISAM 和压缩MyISAM,不管是何种MyISAM表,目前它都不支持事务,行级锁和外键约束的功能
3.MyISAM是表锁(每次更新增加删除都会锁住表)
- MyISAM mergr引擎
很快的读/写速度,对数据安全性要求较低
- memory(heap)引擎
这种类型的数据表只存在于内存中。它使用散列索引,所以数据的存取速度非常快。因为是存在于内存中,所以这种类型常应用于临时表中。
- archive引擎
这种类型只支持select 和 insert语句,而且不支持索引。
MySQL 索引
- 定义:是一种将数据库中一列(或多列)的值进行排序的结构,使用索引可快速访问数据库表中的特定信息。使用B树进行排序
索引的类型
①分类
- 聚簇索引
按照数据存放的物理位置为顺序的,聚簇索引能提高多行检索的速度
- 非聚簇索引
不按照数据存放的物理位置排序,对于单行检索很快
②根据数据库的功能,可创建的索引
1.唯一索引:进行唯一索引的列,不允许出现两个重复的值(允许空值)
2.组合索引:在多个字段上进行创建索引,只有在查询中
3.普通索引:基本的索引,没有任何限制,用于加速查询,数据可以重复
4.主键索引:主键索引是唯一索引的特定类型。该索引要求主键中的每个值都唯一。当在查询中使用主键索引时,它还允许对数据的快速访问
MySQL执行逻辑
先看图
客户端/服务端 -> 连接器 -> (查询缓存,8.0版本以前)-> 分析器 -> 优化器 -> 执行器 -> 调用存储引擎接口
Service层
1.连接器
判断用户的账户和密码,权限获取
尽量减少建立连接的动作,使用长连接
2.查询缓存
缓存通过哈希表的形式存储(key-value),如果命中了key,则直接返回value给客户端。
MySQL8.0以后删除了,弊大于利
查询缓存的失效非常频繁,只要有对一个表的更新,这个表上所有的查询缓存都会被清空。对于更新压力大的数据库来说,查询缓存的命中率会非常低。除非你的业务就是有一张静态表(即很少进行增删改),很长时间才更新。
3.分析器
分为 语法解析 和 预处理,在这个阶段会解析SQL语句的语义,并进行关键词和非关键词进行提取、解析,并组成一个解析树。
4.优化器
简单来说就是:匹配最合适的索引,决定表的连接顺序
5.执行器
执行器会根据表的引擎定义,调用存储引擎API对表进行读写。存储引擎Api只是抽象接口,下面还有一层存储引擎层,具体实现还要看表选择的存储引擎