索引介绍及索引分类
索引是帮助MySQL高效获取数据的数据结构,提取句子主干,就可以得到索引的本质,
索引是数据结构
索引分类
- 主键索引(primary key)
唯一的标识,主键不可重复,只能有一个列作为主键
- 唯一索引(unique key)
避免重复的列出现,唯一索引可以重复,多个列都可以标识唯一索引
- 常规索引( key/index)
默认的index,key关键字来设置
- 全文索引(fulltext)
在特定的数据库引擎下才有,MyISAM
快速定位数据
索引的使用
- 在创建表时给字段增加索引
- 创建完毕后,增加索引
SHOW INDEX FROM student-- 显示表中索引信息
-- 增加一个全文索引 (索引名) 列名
ALTER TABLE student ADD FULLTEXT INDEX `name`(`name`)
-- explan 分析sql执行的状况
EXPLAIN SELECT * FROM student-- 非全文索引
SELECT * student WHERE MATCH(`name`)
EXPLAIN SELECT * FROM student WHERE MATCH(`name`) AGAINST('小');
创建app_user表
CREATE TABLE `app_user`(
`id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) DEFAULT '' COMMENT '用户昵称',
`email` VARCHAR(50) NOT NULL COMMENT '用户邮箱',
`phone` VARCHAR(20) DEFAULT '' COMMENT '手机号',
`gender` TINYINT(4) UNSIGNED DEFAULT '0' COMMENT '性别(0:男;1:女)',
`password` VARCHAR(100) NOT NULL COMMENT '密码',
`age` TINYINT(4) DEFAULT '0' COMMENT '年龄',
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY(`id`)
)ENGINE=INNODB DEFAULT CHARSET=utf8mb4 COMMENT='app用户表'
插入100万条数据
-- 插入100万条数据
DELIMITER $$ -- 写函数之前必须要写,标志
CREATE FUNCTION mock_data()
RETURNS INT
BEGIN
DECLARE num INT DEFAULT 1000000;
DECLARE i INT DEFAULT 1;
WHILE i<num DO
-- 插入语句
INSERT INTO app_user(`name`,`email`,`phone`,`gender`,`password`,`age`)
VALUES(CONCAT('小美女',i),'5201314',CONCAT('18',FLOOR(RAND()*((999999999-100000000)+1000000)))
,FLOOR(RAND()*2),UUID(),FLOOR(RAND()*100)
);
SET i=i+1;
END WHILE;
RETURN i;
END;
SELECT mock_data();
添加索引前后查询比较
EXPLAIN SELECT * FROM app_user WHERE `name`='小美女9999'-- 未插入索引前查了99305条记录
-- id_表名_字段名, CREATE INDEX 索引名 ON 表(`字段`)
CREATE INDEX id_app_user_name ON app_user(`name`)
EXPLAIN SELECT * FROM app_user WHERE `name`='小美女9999'-- 插入索引后查了1条记录
创建索引之前rows=993052
创建索引之后rows=1
索引在小数据量的时候,用处不大,但是在大数据的时候,区别很明显
删除索引
1.ALTER TABLE 表名 DROP INDEX 索引名;
2.DROP INDEX 索引名 ON 表名;
索引原则
- 索引不是越多越好
- 不要对进程变动数据加索引
- 小数据量的表不需要加索引
- 索引一般加在常用来查询的字段上
索引的数据结构
1.Hash类型的索引
2.B tree