MySql划重点

2021/6/16 19:22:47

本文主要是介绍MySql划重点,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

一、索引

	索引数据结构
		二叉树
		红黑树
		Hash表
		BTree
		
	存储引擎
		MyISAM(非聚集)
		InnoDB(聚集)
		
	索引最左前缀原理

	Explain工具使用

	索引最佳实践
	1、全值匹配
	2、最左前缀法则
	3、不在索引列上做任何计算、函数、自动或者手动类型转换,会导致索引失效而转向全表扫描
	4、存储引擎不能使用索引范围条件右边的列
	5、尽量使用覆盖索引,减少select * 语句(虽然mysql会自动根据索引做一些优化)
	6、mysql在使用不等于、大于、小于、not in、not exists的时候无法使用索引会导致全表扫描
	7、is null、is not null一般情况下也不会使用索引
	8、like以通配符开头mysql索引会失效导致全表扫描
	9、字符串不加单引号索引失效
	10、少用or或者in,因为mysql不一定会使用索引,内部优化器会根据检索比例、表大小等多个因素整体评估是否使用索引
	11、范围查询优化,将大的范围拆成多个小的范围

二、Mysql底层原理

	mysql内部结构
		server层
		store层
		
	连接器
		负责连接、授权,注意这里是长连接(默认8个小时),连接信息保存在单独的session会话中(重启mysql服务才可生效)

	分析器
		词法分析器原理
			词法分析
			语法分析
			语义分析
			构造执行树
			生成执行计划
			计划执行
		
	优化器
		优化原则?

	执行器
		调用InnoDB引擎接口执行

	bin-log归档(server层)

三、索引优化实战

	1、联合索引第一个字段用范围不会走索引
	2、强制走索引
		force index
	3、覆盖索引优化
	4、in和or在表数据量大的情况下会走索引,表记录不多的时候选择全表扫描
	5、like KK% 一般情况都会走索引
		索引下推


	mysql如何选择索引
		trace分析
			filesort文件排序
				单路排序
				双路排序
		
		sort_buffer默认1M,内存排序效率高于磁盘排序
		
	索引设计原则
		1、代码现行,索引后上
		2、联合索引尽量覆盖条件
		3、不要在小基数字段上建立索引
		4、长字符串可以采用前缀索引
		5、where和order by冲突时优先where
		6、基于慢sql查询做优化
		

常见sql深入优化
1、order by和group by优化
	1、mysql支持两种排序filesort和index,using index是指mysql扫描索引本事完成排序;index效率更高
	2、order by满足两种情况会使用using index:
		a. order by使用索引最左前缀
		b. 使用where子句与order by子句条件列组合满足最左前缀列
	3、尽量在索引列完成排序
	4、如果order by的条件不在索引列上就会产生using filesort
	5、能用覆盖索引尽量用覆盖索引覆盖
	6、group by和order by类似,其实质都是先排序后分组,对于group by的优化如果不需要排序可以加上order by null禁止排序
	7、能在where中限定的条件就不要取having限定
	
2、分页优化
	1、根据自增且连续的主键排序的分页查询
		如果删数据导致主键不连续就会有问题
	2、根据非主键字段的排序的分页查询
		让排序时返回的字段尽可能少,所以可以让排序跟分页先查出主键,然后根据主键查找对应的记录
		
3、join关联查询优化
mysql表关联常见的有两种算法
	Nested-Loop-Join
	Block Nested-Loop-Join
	
	1、嵌套循环连接(NLJ算法)
		inner join底层会自动选择用小表来驱动大表
	
4、in和exists优化:小表驱动大表

5、count(*) 优化
	1、对于myisam存储引擎做不带where的查询性能很高,因为表的总行数会被mysql记录在存储磁盘上,所以查询不需要计算;而innodb因为有mvcc机制需要计算
	2、show table status
	3、增加数据库计数表
	
	
四、mysql数据类型选择
	数值类型
	日期类型
	字符串类型
	
	
五、Mysql事物

	事物及ACID属性
	
	隔离级别
		读未提交
		读已提交
		可重复读
		可串行化
		
六、Mysql锁机制
	
	性能上分为乐观所和悲观锁
	数据库读写上分析读锁和写锁
	操作粒度上分为表锁和行锁
	
	间隙锁某些情况下可以解决幻读问题
	
	临界锁:行锁和间隙锁的组合
	
	死锁优化建议:
		1、尽可能让所有数据检索都通过索引来完成,避免无索引行升级为表锁
		2、合理设计索引,尽量缩小锁的范围
		3、尽可能减少检索条件范围,避免间隙锁
		4、尽量控制事物大小,减少锁定资源量和实际长度,涉及事物加锁的sql尽量放在事物的最后执行
		5、尽可能低级别食物隔离
		
		
七、MVCC多版本并发控制机制

undo日志版本链与read view机制

innodb引擎sql执行的BufferPool机制

 



这篇关于MySql划重点的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程