MySql高级层面

索引

优势
	1.提高检索效率,降低io成本
	2.降低排序的成本和cpu的消耗
劣势
	1.占据空间
	2.增删改,会降低效率(添加索引字段)
索引结构
	1.索引是在mysql存储引擎中实现的
	类型
		1.BTREE索引
		2.HASH索引
		3.R-TREE索引
		4.FULL-TEXT
		默认使用的是Bree+ 索引,聚集索引,复合索引,前缀索引,唯一索引都是B+索引
Bree
	结构
		- 树中每个节点最多包含m个孩子。
		- 除根节点与叶子节点外,每个节点至少有[ceil(m/2)]个孩子。
		- 若根节点不是叶子节点,则至少有两个孩子。
		- 所有的叶子节点都在同一层。
		- 每个非叶子节点由n个key与n+1个指针组成,其中[ceil(m/2)-1] <= n <= m-1 
		以5叉BTree为例,key的数量:公式推导[ceil(m/2)-1] <= n <= m-1。所以 2 <= n <=4 。当n>4时,中间节点分裂到父节点,两边节点分裂。
	比二叉树要快的原因
		对于相同的数据量来说,BTREE的层级结构比二叉树小,因此搜索速度快。
Bree+结构
	结构
		1). n叉B+Tree最多含有n个key,而BTree最多含有n-1个key。
		2). B+Tree的叶子节点保存所有的key信息,依key大小顺序排列。
		3). 所有的非叶子节点都可以看作是key的索引部分。
	优点
		任何key都要从root走到叶子
		B+Tree的查询效率更加稳定。
索引分类和语法
	分类
		1.单值索引
		2.复合索引
		3.唯一索引
	语法
		TODO
设计原则
	1.查询次数较多
	2.最佳候选列应当从where 查询语句中提取
		where子句中的组合比较多,那么应当挑选最常用、过滤效果最好的列的组合。
	3.使用唯一索引,区分度越高,索引效率就越高
	4.使用短索引
	5、利用最左前缀
		尽量创建了一个复合索引 
			name , email, status一起创建

事务

脏读
	读取了未提交的数据
丢失修改
	多个事务同时修改一个数据,数据进行了覆盖
不可重复读
	第一次读取数据,和第二次读取的数据不一样,中间有其它事务进行了修改
幻读
	这个具体指的是插入和删除操作
隔离级别
	READ-UNCOMMITTED
	READ-COMMITTED
	REPEATABLE-READ
		   1、读取数据的时候有当前读和快照读之分,快照读就是普通的select语句,它就像给数据拍照一样,在事务A开启之后,第一个普通select语句,给当前所有表进行拍照,将数据(底层是由版本控制器实现的)记录下来,之后不管其他事务进行过多少次的修改和commit都不会显示到事务A中。
			2、而当前读,就是指update,delete,insert这些语句相关的select,比如:select * from t for update.这样查出来的数据就是当前读,并且没有版本控制器的限制,就是真实的当前数据库中的数据。并且在事务中使用当前读(update,delete,insert操作)或者之后,就将这个表锁定了,其他事务将不能再操作此表,如果操作就会被阻塞,直到阻塞超时或者拿锁的事务被提交。
			3、当隔离级比可重复读更小的时候,进行当前读等操作,就不会对表进行加锁操作,因为它不需要保证可重复读。
	SERIALIZABLE

MySQL的体系结构

1.连接层
2.服务层
3.引擎层
4.存储层

存储引擎

innodb
	事务控制
	外键约束:
		子表的外键指定是ON DELETE RESTRICT ON UPDATE CASCADE 方式的, 那么在主表删除记录的时候, 如果子表有对应记录, 则不允许删除, 主表在			 	更新记录的时候, 如果子表有对应记录, 则子表对应更新 。
	存储方式
	BTree索引方式
		InnoDB:其数据文件本身就是索引文件。相比MylSAM,索引文件和数据文件是分离的,其表数据文件本身就是按B+Tree组织的一个索引结构,树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。这被称为"聚簇索引(或聚集索引)”,而其余的索引都作为辅助索引,辅助索引的data域存储相应记录主键的值而不是地址,这也是和MylSAM不同的地方。在根据主索引搜索时,直接找到key所在的节点即可取出数据;在根据辅助索引查找时,则需要先取出主键的值,再走一遍主索引。因此,在设计表的时候,不建议使用过长的字段作为主键,也不建议使用非单调的字段作为主键,这样会造成主索引频繁分裂。PS:整理自《Java工程师修炼之道》
MyISAM
	不支持事务
	存储方式
		1.frm :表的结构
		2.myd 存储数据
		3.myi 存储索引
	BTree索引方式
		MylSAM:B+Tree叶节点的data域存放的是数据记录的地址。在索引检索的时候,首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址读取相应的数据记录。这被称为"非聚簇索引"。

存储引擎的选择
	1.innodb: 更新和修改操作,适合高并发和事务,要求安全性高
	2.myisam : 读和写较多,更新和删除较少,且事务和高并发要求不高,最为合适
语法
	show engines
	 show variables like '%storage_engine%'

优化SQL的步骤

1.查看sql执行频率
	1.show status like ‘com________’
	show status like 'Innodb_rows_%';
2.定位低效率执行语句
	1.慢查询日志
	2.使用show processlist 
3.explain分析sql执行计划
	id
		1.表的加载顺序
		2.id越大则越先执行
		3.id相同可以认为是一组 由上到下
	select_type
		SIMPLE
			简单的select查询,查询中不包含子查询或者UNION
		PRIMARY
			查询中若包含任何复杂的子查询,最外层查询标记为该标识
		SUBQUERY
			在SELECT 或 WHERE 列表中包含了子查询
		DERIVED
			在FROM 列表中包含的子查询,被标记为 DERIVED(衍生) MYSQL会递归执行这些子查询,把结果放在临时表中
		UNION
			若第二个SELECT出现在UNION之后,则标记为UNION ; 若UNION包含在FROM子句的子查询中,外层SELECT将被标记为 : DERIVED
		UNION RESULT
			从UNION表获取结果的SELECT
	table
		展示这一行的数据是关于哪一张表的
	type
		1.const
			表示通过索引一次就找到了,const 用于比较primary key 或者 unique 索引。因为只匹配一行数据,所以很快。如将主键置于where列表中,MySQL 就能将该查询转换为一个常量。const于将 "主键" 或 "唯一" 索引的所有部分与常量值进行比较
		2.eq_ref
			类似ref,区别在于使用的是唯一索引,使用主键的关联查询,关联查询出的记录只有一条。常见于主键或唯一索引扫描
		3.ref
			非唯一性索引扫描,返回匹配某个单独值的所有行。本质上也是一种索引访问,返回所有匹配某个单独值的所有行(多个)
		4.rang
			只检索给定返回的行,使用一个索引来选择行。 where 之后出现 between , < , > , in 等操作。
		5.index
			index 与 ALL的区别为  index 类型只是遍历了索引树, 通常比ALL 快, ALL 是遍历数据文件。
		6.all
			将遍历全表以找到匹配的行
	possible_keys
		表示查询时可能使用到的索引
	key
		实际使用的索引
	rows
		扫描行的数量
	extra
		执行情况的说明和描述
		1.using filestore 文件排序
		2.using temporary 查询的临时表,order group
		3.using index
			使用的是本地的索引表
4.show profiling 来显示耗时时间
	show profiling
	show profile for query query_id
		Status
			状态信息
		Duration
			每一步所消耗的时间
		CPU_user
			每个用户占用的cpu
		CPU_system
			系统占用的cpu
5.trace分析优化器执行计划

索引的使用

使用索引
避免索引失效
	1.全值匹配,对所有的列都指定具体的值
	2.最左前缀法则
	3.范围查询右边的列,不能使用索引 
	4.不要在索引列上进行运算操作, 索引将失效。
	5.字符串不加单引号,造成索引失效。
	6.尽量使用覆盖索引,避免select *using index and using where 是最高的
	7.用or分割开的条件, 如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到。
	8.以%开头的Like模糊查询,索引失效。
	9.如果MySQL评估使用索引比全表更慢,则不使用索引。
	9和10因为 再mysql 中 如果全表中 大部分是一样的数据 那么 不走索引是走全表。
	10. is  NULL , is NOT NULL  <font color='red'>有时</font>索引失效。
	这个是为什么 ? 
	11.. in 走索引, not in 索引失效。
	12.单列索引和复合索引。尽量使用复合索引,而少使用单列索引 
查看索引的使用情况

sql语句优化

插入大量数据
	1.如果数据大量的话 使用load
	1) 主键顺序插入
	2) 关闭唯一性校验
	3) 手动提交事务
insert
order by 语句
	1.where 条件和Order by 使用相同的索引
	2.Order By 的顺序和索引顺序相同
	3.Order  by 的字段都是升序,或者都是降序
	fileSort
		一次扫描算法 是在sort  buffer 进行排序,排序时内存消耗比较大
			解决:1.max_length_for_sort_data  
       2.sort_buffer_size 适当大一些
group by
	1.如果是根据 索引进行分组的话,可以加上一个order by null 来提升效率
	explain select age,count(*) from emp group by age order by null;
优化嵌套查询
	1.使用连接查询
优化OR条件
	OR的查询子句,如果要利用索引,则OR之间的每个条件列都必须用到索引 , 而且不能使用到复合索引; 如果没有索引,则应该考虑增加索引
	 union 替换 or :
优化分页查询
	1.利用order by 进行操作,最后连接回表查询
	select * from t_user t ,(select  id from tb_user order by id limit 20000,10) a where a.id=t.id
	2,适用于主键自增的表 转换为某个位置查询
	select * from tb_item where id>1000000 limt 10;
使用sql提示
	user index
	ignore index
	force index

应用优化

使用连接池
减少数据库的访问
cache
负载均衡
MySql 主从复制
分布式数据库架构

Mysql中查询缓存优化

查询数据的流程操作
	查询缓存
		解析器
			预处理器
				查询优化树
					查询执行计划
						查询执行引擎
							api调用接口
查询缓存配置
	SHOW VARIABLES LIKE 'have_query_cache';	
		是否支持缓存
	SHOW VARIABLES LIKE 'query_cache_type';
		是否开启查询缓存
	SHOW VARIABLES LIKE 'query_cache_size';
		查看查询缓存占用的大小
	SHOW STATUS LIKE 'Qcache%';
		查看查询缓存的状态变量
开启查询缓存
	在 /usr/my.cnf 配置中,增加以下配置 :query_cache_type =1
		0、是不走缓存的
		1、是走缓存的
		2、显式指定 SQL_CACHE 的SELECT语句才会缓存
查询缓存失效情况
	1.SQL 语句不一致的情况
	2.查询语句中有一些不确定的情况
		如 : now() , current_date() , curdate() , curtime() , rand() , uuid() , user() , database() 。
	3.不使用任何表查询语句
		select 'A';
	4.查询数据库表的时候不走缓存
		select * from information_schema.engines;
	5.	在存储的函数,触发器或事件的主体内执行的查询
	6.表更改
		则使用该表的所有高速缓存查询都将变为无效并从高速缓存中删除

Mysql 缓存管理及优化

内存优化原则
Myisam优化
	key_buffer_size
	read_buffer_size
	read_rnd_buffer_size
Innodb优化
	innodb_buffer_pool_size
		1.值越大,命中越高,效率也就越高但是还是要在一个合适的值
	innodb_log_buffer_size
		1.适当增大,可以避免在事务提交前,执行不必要的日志 写入磁盘操作

Mysql并发参数调整

 max_connections
	1.默认是151 可以根据服务器的性能来进行增加
back_log
	1.堆栈 ,是达到最大connections 时,再有连接放在的堆栈中的数量
table_open_cache
	1.每个连接的sql 打开一个表缓存max_connections x N ;
 thread_cache_size
	1.缓存客户服务线程的数量,客户服务线程,是备用的线程数量
innodb_lock_wait_timeout
	1.InnoDB 事务等待行锁的时间,不同业务设置不同的值

Mysql锁的问题

MyISam表锁
	特性
		1.偏向MyISAM 存储引擎,开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
		2.在执行更新操作(UPDATE、DELETE、INSERT 等)前,会自动给涉及的表加写锁,这个过程并不需要用户干预
	读写锁
		1) 对MyISAM 表的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求;
		2) 对MyISAM 表的写操作,则会阻塞其他用户对同一表的读和写操作	;
	查看锁的争用情况
		1.show open tables;
		2.	show status like 'Table_locks%';
InnoDB 行锁
	共享锁
	排他锁
		1.UPDATE、DELETE和INSERT语句,InnoDB会自动给涉及数据集加排他锁
	锁失效
		1.如果不通过索引条件检索数据,那么InnoDB将对表中的所有记录加锁,实际效果跟表锁一样。
		如果索引失效,则行锁会变成表锁
	间隙锁 
		1.是在一定的范围之内,进行加锁,
		2、例如:session1:where id<4;             
            session 2: insert table values(2) 
			---id=2           会进行阻塞 
	InnoDB 行锁争用情况
		show status like 'innodb_row_lock%'
优化

Mysql常用工具

mysql
mysqladmin
mysqlbinlog
mysqldump
mysqldumpslow
mysqlimport/source
mysqlshow
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值