MySQL数据库之索引

2019-08-18  本文已影响0人  巴_扎_黑

MySQL数据库表的访问方式又两种:顺序访问、索引访问。
1、顺序访问:
直接进行全表扫描,根据条件逐行记录判断,指导找到相应结果为止。面对当前互联时代,数据量都是成百上千万的存在,这样的访问方式将会及其缓慢,不仅消耗资源还大大影响了效率。基本不会使用此方式。
2、索引访问:
为了解决大数据量情况下也能快速访问,就必须采用索引的方式。索引访问是通过遍历索引来直接访问表中记录行的方式(前提是在该列上有创建索引)。

一、MySQL数据库索引的使用

1、创建索引的几种方式:

CREATE TABLE table_name(          # table_name:表名
id INT NOT NULL PRIMARY KEY,      # PRIMARY KEY MySQL创建表之后会默认创建一个主键索引   
user_name VARCHAR(16) NOT NULL,  
INDEX idx_user_name (user_name(16))  # index_name 索引名称,user_name索引列,(16)长度,如果字段类型是BLOB或TEXT必须制定索引列长度,如果字段类型是CHAR或者VARCHAR可忽略指定长度  
);
CREATE UNIQUE INDEX u_idx_id ON table_name(id);   # 创建唯一索引,一般用于主键,或者其他不能重复的常用查询字段。
CREATE INDEX index_name ON table_name(user_name); # 普通索引 user_name->表字段名
ALTER TABLE table_name ADD UINDEX u_idx_id (id);                # 创建唯一索引
ALTER TABLE table_name ADD INDEX idx_user_name (user_name);     # 创建普通索引

2、删除索引

ALTER TABLE table_name DROP INDEX u_idx_id;    # 通过ALTER命令删除索引 table_name:表名,u_idx_id:索引名
DROP INDEX idx_user_name ON table_name;        # 通过DROP命令直接删除索引 idx_user_name:索引名,table_name:表名

3、查看索引

SHOW INDEX FROM table_name; #table_name:表名

二、MySQL数据库索引相关数据结构

二叉树、红黑树、B-Tree、B+Tree、Hash

1、为什么二叉树和红黑树不适合作为索引的数据结构?

2、B-Tree作为索引:

其中,data可能存储的是当前索引列所属行的其他字段所有数据,当表字段较多,则data占用空间就会变大,当前大节点所能存储的索引总个数就会变少,从而当表数据量过大的时候树的高度也会变得不可控。(MySQL对大节点的默认大小是16K)

SHOW GLOBAL STATUS LIKE 'Innodb_page_size'; # 可修改,建议不要修改

3、B+Tree

MySQL数据库索引真正的数据结构是采用B+Tree实现的(B-Tree的变种)。

4、Hash表作为索引

Hash索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree索引需要从根节点到枝节点,最后才能访问到页节点这样多次的I/O访问,所以Hash索引的查询效率要远高于B-Tree索引。
之所以在使用中不采用Hash索引的主要原因是Hash索引不支持范围查询、不支持数据排序操作。也有可能发生Hash碰撞,但发生碰撞的概率极小。如果对某表的操作操作99%
都是等值查询则可以考虑使用Hash索引,否则不建议采用此索引。

三、MySQL数据库存储引擎索引实现

1、MyISAM存储引擎(非聚簇索引)

CREATE TABLE table_myisam (           # table_myisam:表名称 
  id BIGINT(11) NOT NULL,
  user_id VARCHAR(16) NOT NULL,
  user_name VARCHAR(16) NOT NULL,
) ENGINE=MYISAM DEFAULT CHARSET=utf8  # EGINE=MYISAM 指定表的存储引擎
SQL查询过程:

SQL语句:

SELECT * FROM table_myisam WHERE id = 49;

查询过程:
通过B+Tree索引找到49所在的节点,将该节点数据写入内存,根据该节点data的信息直接去取数据文件的记录,再将结果写入内存。

2、InnoDB存储引擎(聚簇索引)

CREATE TABLE table_innodb (
  id BIGINT(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,    # PRIMARY KEY:主键,AUTO_INCREMENT:自增
  user_id VARCHAR(16) NOT NULL,
  user_name VARCHAR(16) NOT NULL
) ENGINE=INNODB DEFAULT CHARSET=utf8;                   # ENGINE=INNODB:设定存储引擎为InnoDB
面试题:
3、联合索引
# table_innodb : 表名, s_index:索引名, user_id、user_name:字段名
ALTER TABLE table_innodb ADD INDEX s_index (user_id, user_name, birth_date);    # 通过修改表结构的方式创建联合索引
CREATE INDEX s_index ON table_innodb (user_id, user_name, birth_date);          # 直接创建联合索引

不妥之处还请指正...

上一篇 下一篇

猜你喜欢

热点阅读