MySQL-存储引擎-索引
事务
方式1:set @@autocommit = 0 -- 将事务提交方式设置为手动
方式2:start transaction -- 开启事务
事务四大特性ACID:
A:原子性(Atomicity)事务是不可分割的最小操作单元,要么全部成功,要么全部失败
C:一致性(Consistency)事务完成时,必须使所有数据都保持一直状态
I:隔离性(Isolation)数据库提供的隔离机制,保证事务在不受外包部并发操作影响的独立环境下运行
D:持久性(Durability)事务一旦提交或回滚,它对数据库中的数据的修改就是永久的
并发事务问题
脏读:一个事务读取到另外一个事务还没有提交的数据
不可重复读:一个事务先后读取同一条记录,但两次读取的数据不同
幻读:一个事务按条件查询时没有对应数据行,但在插入时,发现数据已存在
事务隔离级
脏读 不可重复读 幻读
Read uncommitted √ √ √
Read committed × √ √
Repeatable Read × × √
Serializable × × ×
-- 查看事务隔离级别
select @@transaction_isolation
-- 设置隔离级别
set { session | global } transaction isolation level {Read uncommitted | Read committed | Repeatable Read | Serializable}
MYSQL体系结构
第一层:连接层(连接池)
第二层:服务层(SQL接口、解析器、查询优化器。。。)
第三层:引擎层(可插拔存储引擎,InnoDB、MyISAM。。。)
第四层:存储层(系统文件、文件和日志)
存储引擎的特点
一:InnoDB
介绍: InnoDB是一种兼顾高可靠性和高性能的通用存储引擎,在mySQL5.5之后成为默认引擎
特点:DML操作遵循ACID模型,支持事务;支持行级锁,提高并发访问性能;支持外键,保证数据完整性和正确性
文件:xxx.ibd xxx表示表名,innoDB引擎的每张表都会对应一个表空间文件,存储该表的表结构(frm、sdi)、数据和索引。
二:MyISAM
介绍:MYISAM是MySQL早起的默认存储引擎
特点:不支持事务,不支持外键;支持表锁,不支持行锁;访问速度快
文件:xxx.MYD (数据信息)、xxx.MYI(索引信息)、xxx.sid(表结构信息)
三、Memory
介绍:存储在内存中,由于收到硬件问题、或断电问题,会导致数据丢失,所以只用来作为临时表或缓存使用
特点:访问速度快、支持hash索引(默认)
文件:xxx.sid 存储表结构信息
索引
介绍:索引是帮助MySQL高效获取数据的数据结构(有序),在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用数据,
这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。
优点:提高数据检索效率,降低数据库的IO成本、通过索引对数据进行排序,降低数据排序的成本,降低CPU的消耗
缺点:占用空间;虽然提高了查询效率,但是降低了增删改的效率
索引的分类:
一:聚集索引(必须有且只有一个)
如图为对id字段建立的聚集索引,其叶子节点指向的就是这一行的数据
二:二级索引(可以有多个)
如图为对name字段建立的一个二级索引,其叶子节点指向的是id字段
索引语法
创建索引:create [unique | fulltext] index index_name on table_name(index_col_name,...)
查看索引:show index from table_name
删除索引:drop index index_name from table_name
SQL性能优化
查询SQL执行频率:
查看服务器状态信息,可以查看当前数据库的增删改查的访问频次
show [global | session] status 'com____';
慢查询日志:
记录了所有执行时间超过指定参数(long_query_time, 单位:秒,默认十秒)的所有SQL语句的日志
MYSQL的慢查询日志默认不开启,需要在MYSQL的配置文件(/etc/my.cnf)中配置:
show_query_log = 1
long_query_time = 2
profiles详情:
查看sql耗时具体详情,默认是关闭的,可以通过set语句在session/global级别开启profiling
#查看每一条sql的耗时情况:
select @@hav_profiling
#开启:
set profiling = 1
#查看指定query_id的SQL语句CPU的使用情况:
show profile cpu for query query_id
explain执行计划:
explain或desc命令获取mysql如何执行select语句的信息,包括执行过程中表如何连接和连接顺序
语法:
explain select 字段列表 from 表名 where 条件
id: select查询的序列号,(id相同,从上往下;id不同,大的先执行)
select_type:select的查询类型,simple(简单表,不适用表连接或子查询)、primary(主查询,外层的查询)、union(union中的第二个或后面的查询语句)、subquery(select/where之后包含的子查询)等。
type:表示连接类型,性能好到差分别为null、system、const、eq_ref、range、index、all
possible_key:显示可能应用在查询中的那个表的索引
key:使用的索引
key_len: 索引长度
索引使用原则:
最左前缀法则:如果索引了多列(联合索引),要遵循最左前缀法则,即查询要从索引的最左列开始,并且不跳过索引中的列。如果跳跃中间某一列,索引将部分失效(后面的字段索引失效)
情景一:跳过索引的第一列,索引全部失效
情景二:查询从索引最左边开始,中间跳过某一列,这一列之后的字段索引失效
范围查询:联合索引中,出现范围查询(> , <),范围查询右侧的列索引失效
如果业务允许,尽量使用 >= , <=
索引列运算操作:不要再索引列上进行运算操作,否则索引将失效
字符串不加引号:字符串字段不加引号,之后的索引失效
模糊查询:如果仅仅是尾部模糊匹配,索引不会失效。如果是头部,则失效
or连接的条件:如果or前的列有索引,而后面的列没索引,那么涉及的索引都不会被用到
数据分布影响:如果mysql评估使用索引比全表更慢,则不使用索引
SQL提示:在sql语句中加入人为的语句来达到优化的目的
select * from tb_user [use | ignore | force] index(idx_user_name) where name = 'xx'
覆盖索引:尽量使用覆盖索引(查询使用了索引,并且需要返回的列,在该索引中已经全部能够找到),减少select *;
回表查询:在二级索引中查找索引,再去聚集索引中找数据
explain中的extra 如果是
using index condition / null:查找使用了索引,但是需要回表查询数据
using where;using index:查询使用了索引,但需要的数据在索引列都能找到,不需要回表查询
前缀索引:当字段类型为varchar、text,有时候需要索引很长的字符串,这会使索引变得很大,查询时浪费大量的磁盘IO,影响效率。此事可以只将字符串的一部分前缀建立索引。
语法:create indedx idx_xxx on table_name(column(n)) # n表示截取几个字符
前缀长度选择:可以根据不重复的索引值(基数)/数据表的记录总数的比值,越靠近1性能越好,查询效率越高
select count(distinct email) / count(*) from tb_user
select count(distinct substring(email, 1, 5)) / count(*) from tb_user
索引设计原理
1.针对数据量大,且查询比较频繁的表建立索引
2.针对常作为查询条件、排序、分组操作的字段建立索引
3.尽量选择区分度高的列作为索引,尽量建立唯一索引
4.如果是字符串类型字段,建立前缀索引
5.尽量使用联合索引,查询时,联合索引很多时候可以覆盖索引,避免回表,提高效率
6.控制索引数量,索引越多,维护索引结构的代价也越大,会影响增删改的效率
7.如果索引列不能存储null值,请在创表时使用not null。优化器知道每列是否包含null值时,可以更换的确认哪个索引更有效地用于查询
InnoDB为什么选择B+树,不选择B树
1.B树只适合做随机检索,而B+树同时支持随机索引和顺序索引
2.利用率高。因为B+树非叶子节点只存索引值,而B树的非叶子节点与叶子节点都会存放数据,由此可见,B+树可以存储更多的索引值,从而使B+树变得更矮,减少I/O次数
3.查询效率更加稳定。B+树由于只有叶子节点存放数据,所以查询效率为O(logn);而B树的查询效率为二分查找的效率O1~O(logn),
4.范围检索性能更佳。B+树的叶子节点形成了双向且有序的链表,大大增加了区间可访问性,只要遍历叶子节点就能实现遍历整棵树。B树节点间相互独立,无法查找区间,如需遍历整棵树,得进行每一层的递归来实现,耗时。
MySQL-存储引擎-索引的更多相关文章
- mysql存储引擎和索引
正确的创建合适的索引,是提升数据库查询性能的基础. 第一章 mysql之索引 索引的定义:索引是为了加速对表中数据行的检索而创建的一种分散存储的数据结构. 我们为什么要使用索引: a.极大的减少存储引 ...
- MySQL存储引擎与索引
引言: MySQL存储引擎主要分为 InnoDB 存储引擎与 MyISAM 存储引擎.都采用B+数的存储结构. 应用场景: InnoDB适合:(1)可靠性要求比较高,要求事务:(2)大量 insert ...
- 为什么用B+树做索引&MySQL存储引擎简介
索引的数据结构 为什么不是二叉树,红黑树什么的呢? 首先,一般来说,索引本身也很大,不可能全部存在内存中,因此索引往往以索引文件的方式存在磁盘上.然后一般一个结点一个磁盘块,也就是读一个结点要进行一次 ...
- MySQL存储引擎MyISAM和InnoDB,索引结构优缺点
MySQL存储引擎MyISAM和InnoDB底层索引结构 深入理解MySQL索引底层数据结构与算法 (各种索引结构优缺点) Myisam和Innodb索引实现的不同(存储结构) 存储引擎作用于什么对象 ...
- Database基础(二):MySQL索引创建与删除、 MySQL存储引擎的配置
一.MySQL索引创建与删除 目标: 本案例要求熟悉MySQL索引的类型及操作方法,主要练习以下任务: 普通索引.唯一索引.主键索引的创建/删除 自增主键索引的创建/删除 建立员工表yg.工资表gz, ...
- MySQL存储引擎,索引及基本优化策略
存储引擎 与Oracle, SQL Server这些数据库不同,MySQL提供了多种存储引擎.什么是存储引擎?存储引擎其实就是一套对于数据如何存储,查询,更新,建立索引等接口的实现.不同存储引擎特性有 ...
- Mysql存储引擎及选择方法
0x00 Mysql数据库常用存储引擎 Mysql数据库是一款开源的数据库,支持多种存储引擎的选择,比如目前最常用的存储引擎有:MyISAM,InnoDB,Memory等. MyISAM存储引擎 My ...
- Mysql存储引擎比较
Mysql作为一个开源的免费数据库,在平时项目当中会经常使用到,而在项目当中我们的着重点一般在设计使用数据库上而非mysql本身上,所以在提到mysql的存储引擎时,一般都不曾知道,这里经过网上相关文 ...
- MySQL存储引擎之Myisam和Innodb总结性梳理
Mysql有两种存储引擎:InnoDB与Myisam,下表是两种引擎的简单对比 MyISAM InnoDB 构成上的区别: 每个MyISAM在磁盘上存储成三个文件.第一个 文件的名字以表的名字开始 ...
- MySQL存储引擎的实际应用以及对MySQL数据库中各主要存储引擎的独特特点的描述
MySQL存储引擎的实际应用以及对MySQL数据库中各主要存储引擎的独特特点的描述: 1.MySQL有多种存储引擎: MyISAM.InnoDB.MERGE.MEMORY(HEAP).BDB(Berk ...
随机推荐
- 前端使用工具规范commit信息
前言 通过工具规范git提交信息也是工程化的一部分,在前端领域有一些工具为我们提供了相关功能,在这里做一下使用总结. commitlint commitlint是什么? 就像eslint用来检查js代 ...
- java初级开发面试题
目录 1.java基础知识 Q1.equals和==的区别 Q2:集合的父类是什么 Q3:List.Hashmap.Set区别 Q4.java数据类型 Q5.javaIO流 Q6.jdk1.8新特性 ...
- ArcObjects SDK开发 025 AO中对象的序列化和反序列化
在ArcObjects SDK,序列化接口是IPersistStream,该接口的定义如下. 其中GetClassID函数可以获取实际类型的唯一ID,Load函数是反序列化函数,Save函数为序列化函 ...
- Educational Codeforces Round 141 (Rated for Div. 2) A-E
比赛链接 A 题意 给一个数组 \(a\) ,要求重排列以后 \(a[i] \neq a[1,i-1]\) ,其中 \(a[1,i-1]\) 是前 \(i-1\) 项和. 如果无解则输出 NO :否则 ...
- CSS中知
1CSS特性 1.3优先级 1.4权重叠加计算 2Chrome调试工具 2.1查错流程 3CSS盒子模型 3.1内容的宽度和高度 3.2边框(border)-连写形式 ...
- 深入Typescript--01-使用roolup编译Typescript
Typescript是什么? TypeScript是Javascript的超集,遵循最新的ES5/ES6规范.Typescript扩展了Javascript语法. 为什么要用Typescript? 1 ...
- echarts系列-带图教你调整左右位置x轴样式网格虚线刻度居中双轴Y轴滚动上下移动文字旋转改分割线颜色部分字体改色折注混合,X轴的颜色,X轴字体颜色,调整柱子颜色,调整小图标图例的大小和位置,鼠标hover时候的样式,用纵向阴影
上面先说注意事项 1.如果使用show hidden控制图表显示隐藏,某些切换效果很奇怪,比如饼图,会从左上角开始放大,很丑,这个时候我们可以设置其宽高来解决问题,给其设置宽高后,切换的奇怪效果即可消 ...
- angular使用_HttpClient或者Fetch发送POST/GET请求下载/上传文件
一:下载文件写法 1.post请求_HttpClient写法. myTest() { const params = { aa: "aa", bb: "bb" } ...
- 记一次简单的诈骗网站Getshell
前言:在放假期间接到一个诈骗电话.然后说京东金条利率过高让我处理下(在疫情开放期间京东客服基本上是没有人工客服),然后就慢慢的被拉入钉钉会议,然后骗子给网站的时候发现域名不对就判定成了骗子就找理由有事 ...
- 表单标签补充及css层叠样式
表单标签补充及css层叠样式 一.表单知识点补充 1.获取用户输入的标签两大重要属性 name属性:类似于字典的键 value属性:类似于与字典的值 # form表单朝后端发送数据的时候,标签必须得有 ...