mysql调优

1.数据类型的优化
不要使用字符串存储日期类型,占用空间大,损失日期类型函数的便捷性
char固定长度的字符串 , 会自动删除末尾的空格
代理主键 与业务无关的,无意义的数字序列(推荐使用代理主键)
自然主键 事物属性中的自然唯一标识
存储引擎 InnoDB(insert,delete,update较快)Myisam(查询较快 但是不支持事务)

2.通过索引进行优化
索引分类 主键索引 指的是主键默认自带的索引
唯一索引 值不重复的索引
全文索引 它只能创建在CHAR、VARCHAR或TEXT类型的字段上
普通索引
组合索引 多个字段添加索引 (回表,覆盖索引,最左匹配)
组合索引abc

B+树 B+ 树非叶子节点上是不存储数据的,仅存储键值,而 B 树节点中不仅存储键值,也会存储数据。
3.聚簇索引与非聚簇索引
聚簇索引:不是单独的索引类型,而是一种数据存储方式,指的是数据行跟相邻的键值紧凑的存储在一起
优点:1、可以把相关数据保存在一起
2、数据访问更快,因为索引和数据保存在同一个树中
3、使用覆盖索引扫描的查询可以直接使用页节点中的主键值
缺点: 1、聚簇数据最大限度地提高了IO密集型应用的性能,如果数据全部在内存,那么聚簇索引就没有什么优势
2、插入速度严重依赖于插入顺序,按照主键的顺序插入是最快的方式
3、更新聚簇索引列的代价很高,因为会强制将每个被更新的行移动到新的位置
4、基于聚簇索引的表在插入新行,或者主键被更新导致需要移动行的时候,可能面临页分裂的问题
5、聚簇索引可能导致全表扫描变慢,尤其是行比较稀疏,或者由于页分裂导致数据存储不连续的时候
非聚簇索引:数据文件跟索引文件分开存放
4.覆盖索引
1、如果一个索引包含所有需要查询的字段的值,我们称之为覆盖索引
2、不同的存储实现覆盖索引的方式不同,不是所有的引擎都支持覆盖索引,memory不支持覆盖索引
优势
1、索引条目通常远小于数据行大小,如果只需要读取索引,那么mysql就会极大的较少数据访问量
2、因为索引是按照列值顺序存储的,所以对于IO密集型的范围查询会比随机从磁盘读取每一行数据的IO要少的多
3、一些存储引擎如MYISAM在内存中只缓存索引,数据则依赖于操作系统来缓存,因此要访问数据需要一次系统调用,这可能会导致严重的性能问题
4、由于INNODB的聚簇索引,覆盖索引对INNODB表特别有用
5.优化小细节
1.当使用索引列进行查询的时候尽量不要使用表达式,把计算放到业务层而不是数据库层
2. 尽量使用主键查询,而不是其他索引,因此主键查询不会触发回表查询
3. 使用前缀索引
4. 使用索引扫描来排序
5. union all,in,or都能够使用索引,但是推荐使用in
6. 范围列可以用到索引 * 范围条件是:<、> 范围列可以用到索引,但是范围列后面的列无法用到索引,索引最多用于一个范围列
7. 强制类型转换会全表扫描
8. 更新十分频繁,数据区分度不高的字段上不宜建立索引
10. 当需要进行表连接的时候,最好不要超过三张表,因为需要join的字段,数据类型必须一致
11. 能使用limit的时候尽量使用limit
12. 单表索引建议控制在5个以内
13. 单索引字段数不允许超过5个(组合索引)
创建索引的列,不允许为null,可能会得到不符合预期的结果
写在最后
(1)索引并非越多越好一个表中如有大量的索引,不仅占用磁盘空间,而且会影响INSERT、UPDATE、DELETE等语句的性能。因为在更改表中的数据的同时,索引也会进行调整和更新。(建议控制在5个字段以内)
(2)避免对经常更新的表建立过多的索引避免对经常更新的表建立过多的索引,并且索引中的字段要尽可能得少。对经常查询的字段应该建立索引,但要避免对不必要的字段建立索引。
(3)数据量小的表最好不要使用索引由于数据较少,查询花费的时间可能比遍历索引的时间还要短,索引可能不会产生优化的效果。
(4)在不同值较少的字段上不要建立索引字段中的不同值比较少,例如学生表的“性别”字段,只有“男”和“女”两个值,这样的字段就无须建立索引,建立索引后不但不会提高查询效率,反而会严重降低更新速度。
(5)为经常需要进行排序、分组和连接查询的字段建立索引为频繁进行排序或分组的字段和经常进行连接查询的字段创建索引。 ----<<MySQL数据库应用与技术>>

posted @ 2021-10-20 22:41  三只坚果  阅读(185)  评论(0编辑  收藏  举报