MySQL 中创建索引的语句和 explain

MySQL 中创建索引的语句和 explain

索引为什么使用B+树,而不是B树

存储方式

数据库中是按照块进行存储,在计算机的世界中,所有的与空间相关的内容全部是按照块进行存储和使用的,只是块的大小划分不同而已。

例如:文件系统中,即硬盘中,每块的大小是4K;在计算机内存中,按照32位一个块就行存储的。

块大的优点:
相对于小块存储,块大后一次可以存储和取出更多的数据,这样就降低了存取的次数;

缺点:
会浪费更多的计算机储存空间;例如一个文件只有3K,但也必须为其开辟一个4K大小的存储空间。

使用B+树的原因

  1. B-树的存储,数据和索引在一起,每条数据和索引同时占有块的存储空间,B-树阶数越高,需要查询的块数就越多;
  2. 如果使用B+树,由于B+树的性质,数据都存在叶子节点,而根节点或父节点存储的是索引,如此一来,可以将上面的索引单独存储起来,叶子节点的数据单独存储起来,由于索引占用的空间比实际数据小很多,所以存储索引所用的块会比较少,这样在查询较深的数据时也不会查询太多的块。

随机I/O和顺序I/O

即相当于硬盘中随机读写和顺序读写;其时间倍数约为 随机读写 * 1000 = 顺序读写

如果树的每一层都是顺序存储,每层间进行查找都属于随机I/O,如此一来,B-树在查找数据时,根据中序遍历的规则,B-树会进行多次的随机I/O,而B+树相对一次查询来说,次数会少很多次,从而提高了查询速度。

B+Tree

正常情况下,如果不指定索引的类型,那么一般是指B+Tree索引(或者B+Tree索引)。存储引擎以不同的方式使用B+Tree索引。性能也各有不同,但是InnoDB按照原数据格式进行存储。

B+Tree 索引能够加快数据的读取速度,因为存储引擎不再需要进行全表扫描来获取需要的数据,相反是从索引的根节点开始进行搜索,通过相应的指针移动,最终存储引擎要么找到了对应的值,要么该记录不存在。树的深度与表的大小直接相关。

B+Tree索引是按照顺序组织存储的,所以适合范围查找数据

B+Tree索引使用与全键值、键值范围或者键前缀查找,其中键前缀进适用于根据最左前缀的查找。

a、 全值匹配

b、 匹配最左前缀。

c、 匹配列前缀。

d、 匹配范围值

e、 精确匹配某一列并范围匹配另外一列。

f、 只访问索引的查询(覆盖索引)

B-Tree索引的限制:

a、 如果不是按照索引的最左列开始查找,那么无法使用索引

b、 不能跳过索引中的某些列。

c、 如果查询中使用了某个列的范围查询,那么该列右边的所有列都无法使用索引。

MySQL 中 B+树索引的两种类型

聚集索引

聚集索引是指数据库表行中数据的物理顺序与键值的逻辑(索引)顺序相同;索引之下的一个叶子节点就是一条数据。

MySQL中聚集索引只有一个,就是主键。

非聚集索引

非聚集索引是一种索引,该索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同。;索引之下的叶子节点指向的是主键而不是数据。

MySQL中除了主键以外的索引为非聚集索引。

MySQL中多个列的索引

多个索引就相当于B+树上的节点的每个数据是一个元组形式

主键

主键为聚集索引,主键不能为空。

唯一键

如果唯一键和主键同时存在,则唯一键为非聚集索引;如果主键不存在,则唯一索引为聚集索引。

唯一键可以为空,这是它与主键的区别所在。

创建语句

create unique index index_name on tabl_name (列名1[,列名2])

普通索引

普通索引为非聚集索引,普通索引无限制。

创建语句

create index index_name on table_name(列名1[,列名2])

explain 执行计划

explain 指的是某个sql语句的执行计划:explain sql语句

id: 1
select_type: SIMPLE(简单查询,不是多表查询和复杂查询) 可能的值:simple,primary,union,dependent union,union result
table: php114(表名)
type: ALL()     可能的值:system,const(最优化,使用了主键或者唯一健),eq_ref,ref.ref_or_null,index_merge
possible_keys: NULL         提示使用哪个索引会在该表中找到行
key: NULL()     mysql使用的索引,简单且重要
key_len: NULL()     mysql使用的索引长度
ref: NULL          显示使用哪个列或者常数与key一起从表中选择行
rows: 6          mysql执行查询的行数,简单且重要,数值越大越不好,说明没有用好索引
Extra:          包含mysql解决查询的详细信息

你可能感兴趣的:(MySQL 中创建索引的语句和 explain)