最近学习MySQL的索引,以下是一点学习心得与总结:
我们都知道,在java的语法中,index指数组中的下标;但在MySQL中,index的意思是索引。
1. 何为索引
MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。
解构这句话,分析和总结一下信息点,即:
索引,就是一种排好序,用于高效快速查找数据的,数据结构 。
详解:
数据库=数据+数据结构;
在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据;
这样就可以在这些数据结构上实现高级查找算法。
而这种数据结构,就是索引。
如果把MySQL比作一本书,那么,数据库就是封皮,索引就是目录页,数据就是书的正文页;
一般来说,索引本身也很大,所以它往往以索引文件的形式存储在磁盘中;
2. MySQL索引结构
我们平常所说的索引,如果没有特别指明,都是指B树结构组织的索引(BTREE,即Balance Tree,多路平衡查找树,一般是二分的,但是也不一定);
ps:关于B树、二叉树、B-树、B+树的数据结构区别,会另写一篇博文总结。
另外在开发中,常用索引结构还有Hash索引、full-text全文索引、R-Tree索引;由于这些都与DBA(数据库管理)无关,不概述。
3. MySQL索引分类
(1)单值索引
即一个Index中只包含单个字段(列),一个table中可以有多个单值索引;
(2)唯一索引(UNIQUE)
指Index中字段的值,必须唯一(字段列的值不允许重复),但允许是null(即字段列中只有一个值是null的情况下);但唯一索引字段列中有null,会降低效率,工作中一般不推荐使用;
ps: PRIMARY KEY AUTO_INCREMENT,自增主键天生就是单值且唯一索引;
ps:数据库中null和空是两码事,空是’‘表示(单引号间没有空格);
null占空间,空是不占空间的;
在创建字段列时若DEFAULT NOT NULL,那么该字段可以插入’’,但不可以插入null;
(3)复合索引
即一个Index中包含多个字段(列)。
4. MySQL索引基本语法
(1)创建索引([]表示可省略)
① 直接创建
CREATE [UNIQUE ] INDEX indexName ON mytable(col01,col02,col03......);
在表mytable中,创建(唯一)复合索引,索引名indexName,索引字段是col01,col02,col03…
② 修改表的同时创建
ALTER TABLE 表名 ADD [UNIQUE ] INDEX [indexName] ON (columnname(length))
修改表,在表中加入(唯一)索引,索引名indexName,索引字段是columnname(length);
(2)删除索引
DROP INDEX [indexName] ON mytable;
(3)查看索引
SHOW INDEX FROM 表名\G
ps:/G是将显示结果由横排转竖排显示
(4)使用ALTER命令添加数据表的索引
有3种方式来添加数据表的索引:
①
ALTER TABLE tbl_name ADD PRIMARY KEY (column_list):
该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。
②
ALTER TABLE tbl_name ADD UNIQUE index_name (column_list):
这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。
③
ALTER TABLE tbl_name ADD INDEX index_name (column_list):
添加普通索引,索引值可出现多次。