索引的基础使用
索引:
分类:
- 功能逻辑:普通索引、唯一索引、主键索引、全文索引
- 物理实现方式:聚簇索引,非聚簇索引
- 作用字段个数:单列索引,联合索引
索引创建:
--主键索引
CREATE TABLE dept(
dept_id INT PRIMARY KEY AUTO_INCREMENT,
dept_name VARCHAR(20)
);
--emp_name 唯一索引,emp_dept_id 外键
CREATE TABLE emp(
emp_id INT PRIMARY KEY AUTO_INCREMENT,
emp_name VARCHAR(20) UNIQUE,
dept_id INT,
CONSTRAINT emp_dept_id_fk FOREIGN KEY(dept_id) REFERENCES dept(dept_id)
)
查看表索引:
show index from book;
Non_unique :0(唯一索引),1(不是唯一索引)
性能分析:
EXPLAIN SELECT * from book where book_name = 'mysql高级'
唯一索引(unique): 插入的数据不能重复,但是可插入索引字段为null,且可重复多次
主键索引(primary key):可以删除主键索引,如果主键索引有Auto_increment约束字段的唯一索引则不能删除;
- 设定为主键后数据库会自动建立索引,innodb为聚簇索引
- 修改主键索引:必须先删除掉(drop)原索引,再新建(add)索引
alter table xxxx DROP PRIMARY KEY
联合索引:具有最左原则
CREATE TABLE test3(
id INT(11) NOT NULL,
name CHAR(30) NOT NULL,
age INT(11) NOT NULL,
info VARCHAR(255),
INDEX multi_idx(id,name,age)
);
联合索引的顺序严格按照创建时顺序执行。
联合索引的具体体现:
EXPLAIN SELECT * from test3 where id = 10001 and age = 22;
EXPLAIN SELECT * from test3 where age = 22
由上述解释器可以看出,第一条sql执行,由索引参与,但第二条sql略过id直接查询name,则联合索引失效
possible_keys:
- 查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询实际使用
key:实际使用的索引,如果为NULL,则没有使用索引
simple:简单SELECT(不使用UNION或子查询等)
index_type:存储引擎类型
创建普通表:索引的其他设置方式
CREATE TABLE test4 (
id INT ( 11 ) NOT NULL,
NAME CHAR ( 30 ) NOT NULL,
age INT ( 11 ) NOT NULL,
info VARCHAR ( 255 )
)
--创建单列索引
alter table test4 add index idx(id);
--创建唯一索引
ALTER TABLE test4 add UNIQUE index uk_idx_name(name);
--创建联合索引
ALTER TABLE test4 add index mul_id_name_info(id,name);
--创建主键索引
alter table test4 add PRIMARY KEY idx_pri(id)
删除索引及新特性
--删除索引
ALTER table book1 drop index uk_idk_cmt;
--删除索引中的字段(可将联合索引降至单列索引)
alter table test3 drop COLUMN name
支持降序索引和隐藏索引
MySQL8.0之前创建的索引是升序索引,使用时反向扫描,效率低;MySQL8.0之后支持降序索引。
CREATE TABLE ts1(a int,b int,index idx_a_b(a,b desc));
show create table ts1;
--结果看:索引已经是降序了
-- ts1 CREATE TABLE `ts1` (
-- `a` int DEFAULT NULL,
-- `b` int DEFAULT NULL,
-- KEY `idx_a_b` (`a`,`b` DESC)
-- ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
隐藏索引:软删除(invisible(不可见性),visible(可见性)),如果设置的隐藏索引对系统无影响,则可删除该索引;
主键不能被设置为隐藏索引。当表中没有显式主键时,表中第一个唯一非空索引会成为隐式主键,也不能设置为隐藏索引。
注意:当索引被隐藏时,它的内容仍然是和正常索引一样实时更新的。如果一个索引需要长期被隐藏,那么可以将其删除,因为索引的存在会影响插入、更新和删除的性能。