赞
踩
插件式存储引擎是MySQL数据库最重要的特性之一,用户可以根据应用的需要选择如何存储和索引数据、是否使用事务等。MySQL默认可以支持多种引擎,适用于不同领域的数据库用于需要,常见的MySQL存储引擎有:InnoDB
、MyISAM
、Memory
、NDB Cluster
等等,在mysql 的命令行窗口中,我们可以通过命令show engines
查看
存储引擎 | 锁机制 | B-树索引 | 哈希索引 | 外键 | 事务 | 索引缓存 | 数据缓存 |
---|---|---|---|---|---|---|---|
InnoDB | 行锁 | 支持 | 不支持 | 支持 | 支持 | 支持 | 支持 |
MyISAM | 表锁 | 支持 | 不支持 | 支持 | 不支持 | 支持 | 不支持 |
Memory | 表锁 | 支持 | 支持 | 不支持 | 不支持 | 支持 | 支持 |
锁机制:数据库在并发请求访问的时候,多个事务在操作时,并发操作的粒度
B-树索引和哈希索引:加速SQL的查询速度
外键:子表的字段依赖父表的主键,设置两张表的依赖关系
事务:多个SQL语句,保证它们共同执行的原子操作
索引缓存和数据缓存:与MysSQL Server的查询缓存相关,在没有对数据和索引进行修改前,重复查询可以不进行磁盘I/O,直接上一次内存中查询的缓存
当表中的数据量达到了几十万甚至上百万时,SQL查询所花费的时间会很长,有时会导致业务出现超时出错,这时我们需要使用索引来加速SQL的查询速度。但索引本身也是需要存储成索引文件1的,因此对索引的使用也会涉及到磁盘I/O操作,如果索引创建过多或使用不当,仍然会造成SQL查询时的大量的无用的磁盘I/O操作,降低查询效率,因此我们需要理解清楚索引创建的原则
索引的优点:提高查询效率
索引的缺点:过多的索引会导致CPU使用了居高不下,数据的改变造成索引文件的改动,过多的磁盘I/O造成CPU负荷太重
索引的分类:
使用索引的原则:
force index
强制索引,select * from xxx force index(ix_addtime);
join
,按各表的查询条件比较哪个表开销小,从小表取出符合条件的,到大表循环查找查看表的索引:有一个主键索引
索引的创建和删除
//创建时指定的索引字段
create table user(
id int primary key,
name varchar(50),
age int,
index(name, age); //这是多列索引
);
//在已经创建的表上添加索引
create index name_idx on user(name);
//删除索引
drop index name_idx on user;
这是添加了name_idx的结果
查找指定的 id = 10000
查找指定的 name = ‘Test_50000’
删除name_idx索引,再查找指定的 name = ‘Test_50000’
通过上述的查询操作,效果可见一斑,现在给出explain
结果字段分析
select_type
table
type
ref
Extra
索引搜索的具体过程 !!!
当SELECT涉及到索引时,数据库系统会优先从内存中的索引缓存中查找匹配的数据行。如果索引缓存中不存在需要的索引,数据库系统会通过磁盘IO操作,从磁盘中读取索引页,找到匹配的数据行,然后将其加载到内存中加速查询数据的执行
MySQL能够支持两种索引:B-树索引、哈希索引(但实际上MySQL采用的是B+树结构)
B树索引
B树索引是一种特殊的B树,它被设计用于在磁盘上存储数据。因为磁盘的访问速度相对较慢,所以B树索引被优化为减少磁盘访问次数。它可以将大量的数据分层存储在不同的节点中,使得查询的时候只需要少量的磁盘读取操作。由于磁盘的读取也是按block块操作的(内存是按page页面操作的),因此B-树的节点大小一般设置为和磁盘块大小一致,这样一个B-树节点,就可以通过一次磁盘I/O把一个磁盘块的数据全部存储下来,所以当使用B-树存储索引的时候,磁盘I/O的操作次数是最少的
B树索引的原理如下:
每个节点可以包含多个key-value对,其中key是索引列的值,value是对应的数据行的指针或位置(下图B-树是基于InnoDB存储引擎的,索引树上放的就是数据,所以data存储的直接就是数据本身的内容;而如果是MyISAM存储引擎,由于存放索引和数据的是两个不同的文件,其data存储的是在磁盘上包含的对应索引值记录的地址)
所有的节点都按照key的大小有序存储,也就是说,节点中的key是递增的
每个节点中的key可以重复,这样可以处理重复值的情况
每个节点中可以有多个子节点,子节点的key的范围必须满足一定的条件,使得它们可以作为查询的条件进行过滤
每一个叶子节点都包含一个指向数据行的指针或位置,这样可以直接找到需要的数据
从上图可以看到B-树存在的缺点:
虽然B-树有很多优点,但在MySQL里,却是采用B+树存储索引结构的
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。