7、索引
MySQL官方对索引的定义为:索引(index)是帮主MySQL高效获取数据的数据结构。 0.5s->0.000001s
提取句子主干,就可以得到索引的本质:索引就是数据结构
7.1、索引的分类
- 主键索引(PRIMARY KEY)
唯一的标识,主键不可重复,只能有一个列作为主键
- 唯一索引(UNIQUE KEY)
避免重复的列出现,唯一索引可以重复,多个列都可以标识位,唯一索引
- 常规索引(KEY/INDEX)
默认的,index,key关键字来设置
- 全文索引(FullText)
在特定的数据库引擎下才有,MylSAM
快速定位位置
-- 索引的使用
-- 1、在创建表的时候给字段添加索引
-- 2、创建完毕后,增加索引
-- 显示所有的索引信息
SHOW INDEX FROM student;
SELECT * FROM student;
-- 增加一个全文索引
ALTER TABLE school.`student` ADD FULLTEXT `studentName`(`studentName`);
-- EXPLAIN 分析sql执行的状况
EXPLAIN SELECT * FROM student; -- 非全文索引
EXPLAIN SELECT * FROM student WHERE MATCH(studentName) AGAINST ('赵');
7.2、测试索引(拓展)
建表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,
`update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='app用户表'
批量插入数据:100万
DROP FUNCTION IF EXISTS mock_data;
DELIMITER $$
CREATE FUNCTION mock_data()
RETURNS INT
BEGIN
DECLARE num INT DEFAULT 1000000;
DECLARE i INT DEFAULT 0;
WHILE i < num DO
INSERT INTO app_user(`name`, `email`, `phone`, `gender`, `password`, `age`)
VALUES(CONCAT('用户', i), '24736743@qq.com', CONCAT('18', FLOOR(RAND()*(999999999-100000000)+100000000)),FLOOR(RAND()*2),UUID(), FLOOR(RAND()*100));
SET i = i + 1;
END WHILE;
RETURN i;
END;
SELECT mock_data();
索引效率测试
SELECT * FROM app_user WHERE name = '用户9999'; -- 查看耗时0.993s
SELECT * FROM app_user WHERE name = '用户9999'; -- 1.098s
SELECT * FROM app_user WHERE name = '用户9999'; -- 0.788s
-- 创建索引
CREATE INDEX idx_app_user_name ON app_user(name);
-- 测试普通索引
EXPLAIN SELECT * FROM app_user WHERE name = '用户9999'; -- 0.001s
SELECT * FROM app_user WHERE name = '用户9999';
-- 1 row in set (0.00 sec)
SELECT * FROM app_user WHERE name = '用户9999';
-- 1 row in set (0.00 sec)
索引在小数据量的适合,用户不大,但是在大数据的适合,区别十分明显
7.3、索引原则
- 索引不是越多越好
- 不要对经常变动的数据加索引
- 小数据量的表不需要加索引
- 索引一般加在常用来查询的字段上
索引的数据结构
hash类型的索引
Btree:InnoDB的默认数据结构
摘录自遇见狂神说