mysql总结:索引,存储引擎,大批量数据插入,事务,锁
2022/3/8 19:15:05
本文主要是介绍mysql总结:索引,存储引擎,大批量数据插入,事务,锁,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
mysql总结
索引概述:
-
索引是高效获取数据的数据结构
索引结构:
-
B+Tree()
-
Hash(不支持范围查询,精准匹配效率极高)
存储引擎:
常见存储引擎:
-
Myisam:5.5之前默认引擎,支持表锁,不支持外键和事务,查询插入性能很高
-
InnoDB:支持事务,外键,支持行级锁,5.5之后默认存储引擎,5.6之后支持全文索引
-
Memory:所有数据置于内存中,拥有极高的效率,但是重启数据会丢失
-
Archive:拥有很快的插入速度,但是查询相对差劲
-
Federated:将不同的mysql服务器联合,逻辑形成一个完整的数据库,适合分布式场景
树的区别:
-
二叉树:可能产生不平衡,顺序数据可能会出现链表结构
-
平衡二叉树:插入需要自旋,性能根据层级而定,性能不稳定
-
b+tree:
-
主键聚簇叶子节点存放数据,非叶子节点存放索引,
-
二级索引非叶子节点存放索引,叶子节点存放主键
-
索引优缺点:
优点:
-
大大加快查询速度
-
使用分组和排序时候可以显著减少分组和排序时间
-
唯一索引可以保证字段唯一
-
可以加速表与表之间的连接
缺点
-
创建和维护索引需要消耗时间,随着数据量增加时间也会增加
-
占用磁盘空间
-
对表进行urd操作时候也要动态维护,urd性能会下降
创建索引原则(我们对哪种数据创建索引):
-
更新频繁数据不易创建索引
-
数据量少的没必要创建,全表和用索引可能差不多
-
首先考虑在where和orderby字段建立索引
索引分类:
单列索引(只包含单个列):
-
主键索引:唯一且不为null,一个表只能有一个,(聚集索引:叶子节点下存储数据)
-
唯一索引:唯一且只能有一个Null值(二级索引,叶子节点存储主键)
-
普通索引:没有限制(二级索引,叶子节点存储主键)
组合索引/复合索引(包含多列):
-
为了避免回表,进行更高效的查询
全文索引:
-
like+%(InnoDB(5.6之后支持)默认3个字符,最大84,MyISam默认4最小1个字符)
空间索引(使用较少)
Sql性能分析
-
数据库的执行频次
- show session status like 'Com_____'; --查询当前会话统计结果 - show global status like 'Com_____'; --查询字数据库上次启动至今的结果 - show status like 'Innodb_rows_%';
-
慢查询日志
-- 查看慢日志配置信息 show variables like '%slow_query_log%’; -- 开启慢日志查询 set global slow_query_log=1; -- 查看慢日志记录SQL的最低阈值时间 show variables like 'long_query_time%’; -- 修改慢日志记录SQL的最低阈值时间 set global long_query_time=4;
-
profile Sql执行查询
-
explain/desc执行计划查询
-
id 相同表示加载表的顺序是从上到下。
-
id 不同id值越大,优先级越高,越先被执行。
-
id 有相同,也有不同,同时存在。id相同的可以认为是一组,从上往下顺序执行;在所有的组中,id的值越大,优先级越高,越先执行。
-
type含义
-
extra含义
-
索引使用
联合索引:
-
遵循最左原则,如果最左使用中间跳过了某个字段,会造成后面索引失效,范围查询右侧的列会失效,尽量是<= ,>=
索引失效:
-
索引列进行了函数运算
-
没有遵循最有匹配原则
-
字符串类型索引没有加'',造成隐士转换,导致索引失效
-
左模糊查询
-
如果最左使用中间跳过了某个字段,会造成后面索引失效,范围查询右侧的列会失效,尽量是<= ,>=
-
mysql优化器判定全表比用索引块
-
or链接索引失效
sql提示:
-
多个索引下,可以提醒执行器是由哪个索引,建议使用,忽略使用,强制使用
覆盖索引:
-
查询返回字段都在联合索引中会直接拿到数据,避免回表即联合索引
前缀索引:
-
针对字段数据库较大的建立索引,缩小索引长度
单列/联合索引:
-
避免单列索引在and情况下第二索引不生效,使用联合索引,使用恰当可避免回表
索引设计原则
-
表层面:数据量大,且查询频繁
-
字段层面:经常在where groupby orderby后的字段
-
索引层: 唯一的建立唯一索引,尽量联合索引,大文本尽量前缀索引
-
附加原则:
-
区分度较高
-
索引不易过多
-
索引不为null加上非空约束
-
所长度尽量短
-
锁机制
锁的分类:
按粒度分:
-
全局锁:锁定全局,用于数据备份保证数据库完整性
-
表锁(加锁快,并发低,不会死锁):
-
表锁:锁定整张表
-
元数据锁:保证数据完整执行,修改的锁会和所有锁冲突
-
意向锁:为了避免加表锁时候,全局扫描行锁
-
-
行锁(加锁慢,锁冲突低,并发高,会死锁)
-
行锁:锁定单行数据
-
间隙锁:锁定间隙,不包含当前数据
-
临键锁:锁定当前数据和间隙(行锁+间隙锁)
-
按类型分:
-
读锁(共享):阻塞写,可读
-
写锁(排他):阻塞读写
事务
事务隔离级别:
-
读未提交:一个事务可以读取另一个事务未提交的数据(脏读,不可重复读,幻读)
-
读已提交:可读取另一个事务已经提交的事务(不可重复读,幻读)
-
不可重复读(默认):事务开启时不在允许修改操作,可避免脏读,不可重复读但是会造成(幻读)
-
串行化:最高事务隔离级别,效率低下
大批量数据插入优化
-
主键顺序插入
-
批量插入减少IO,批量最好500左右
-
load加载数据至数据结构
-- 1、首先,检查一个全局系统变量 'local_infile' 的状态, 如果得到如下显示 Value=OFF,则说明这是不可用的 show global variables like 'local_infile'; -- 2、修改local_infile值为on,开启local_infile set global local_infile=1; -- 3、加载数据 /* 脚本文件介绍 : sql1.log ----> 主键有序 sql2.log ----> 主键无序 */ load data local infile 'D:\\sql_data\\sql1.log' into table tb_user fields terminated by ',' lines terminated by '\n';
-
关闭唯一性校验,加载后再打开
-- 关闭唯一性校验 SET UNIQUE_CHECKS=0; truncate table tb_user; load data local infile 'D:\\sql_data\\sql1.log' into table tb_user fields terminated by ',' lines terminated by '\n'; SET UNIQUE_CHECKS=1;
-
减少事务,批量执行数据
-
这篇关于mysql总结:索引,存储引擎,大批量数据插入,事务,锁的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-20部署MySQL集群入门:新手必读指南
- 2024-11-20部署MySQL集群教程:初学者指南
- 2024-11-20部署MySQL集群项目实战:新手教程
- 2024-11-20部署MySQL集群资料:新手入门教程
- 2024-11-20MySQL集群部署教程:入门级详解
- 2024-11-20MySQL集群教程:入门与实践指南
- 2024-11-20部署MySQL集群教程:新手入门指南
- 2024-11-20MySQL读写分离教程:轻松入门
- 2024-11-20部署MySQL集群入门:一步一步搭建你的数据库集群
- 2024-11-19部署MySQL集群学习:入门教程