目录
一、索引基本概念
二、 索引的特点
三、 索引的优点
四、 索引的缺点
五、索引分类
六、创建索引
1、和表一起创建索引
2、表创建之后添加索引ALTER
3、查看建立的索引
4、删除索引
七、查询优化
1、id
2、select_type
3、table
4、type
5、possible_keys
6、Key key
7、key_len
8、ref
9、rows
10、Extra
八、慢查询
索引就是加快检索表中数据的方法。数据库的索引类似于书籍的目录。在书籍中,索引允许用户不必 翻阅完整个书就能迅速地找到所需要的信息。在数据库中,索引也允许数据库程序迅速地找到表中的数 据,而不必扫描整个数据库。
索引可以加快数据库的检索速度
索引分类
1. 普通索引(INDEX)
2. 唯一索引(UNIQUE)
主键索引(PRIMARY KEY)=>UNIQUE + NOT NULL
唯一索引(UNIQUE),唯一索引允许有空值NULL
3. 联合索引
联合主键索引 PRIMARY KEY (id,name)
联合唯一索引 UNIQUE(id,name)
联合普通索引 INDEX(id,name)
4. 全文索引(FULLTEXT),全文检索
5. 空间索引(SPATIAL),实际中几乎不用
CREATE TABLE `user1` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(20) NOT NULL COMMENT '登录账号', -- 登录账号必须唯一
`password` char(32) NOT NULL COMMENT '登录密码',
`nickname` varchar(10) DEFAULT NULL COMMENT '昵称' , -- 昵称默认为可以不存在
`sex` tinyint unsigned NOT NULL DEFAULT '0' COMMENT '性别',
`introducation` varchar(255) DEFAULT NULL COMMENT '个人简介',
`province_id` int unsigned NOT NULL DEFAULT '0' COMMENT '省id',
`city_id` int unsigned NOT NULL DEFAULT '0' COMMENT '市id',
`area_id` int unsigned NOT NULL DEFAULT '0' COMMENT '区域id',
`address` varchar(255) DEFAULT NULL COMMENT '具体地址',
UNIQUE INDEX unique_index_username(`username`), -- 唯一索引登录账号
INDEX index_nickname(`nickname`), -- 普通索引
FULLTEXT INDEX fulltext_index_introducation(`introducation`), -- 全文索引
INDEX detail_address(`province_id`,`city_id`,`area_id`), -- 联合索引
PRIMARY KEY primary_key(`id`) -- 主键索引
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4
COLLATE=utf8mb4_unicode_ci;
ALTER TABLE tbl_name
[alter_option [, alter_option] ...]
alter_option: {
table_options
| ADD {INDEX | KEY} [index_name]
[index_type] (key_part,...) [index_option] ... -- 添加普通索引
| ADD {FULLTEXT | SPATIAL} [INDEX | KEY] [index_name]
(key_part,...) [index_option] ... -- 添加全文或者空间索引
| ADD [CONSTRAINT [symbol]] PRIMARY KEY
[index_type] (key_part,...)
[index_option] ... -- 添加主键约束
| ADD [CONSTRAINT [symbol]] UNIQUE [INDEX | KEY]
[index_name] [index_type] (key_part,...)
[index_option] ... -- 添加唯一约束
| ALTER INDEX index_name {VISIBLE | INVISIBLE} -- 修改索引是否可见 默认
VISIBLE,MYSQL8支持
| DROP {INDEX | KEY} index_name -- 删除索引
| DROP PRIMARY KEY -- 删除主键索引
| RENAME {INDEX | KEY} old_index_name TO new_index_name -- 重命名索引
}
key_part: {col_name [(length)] | (expr)} [ASC | DESC]
index_type:
USING {BTREE | HASH}
index_option: {
KEY_BLOCK_SIZE [=] value
| index_type
| WITH PARSER parser_name
| COMMENT 'string'
| {VISIBLE | INVISIBLE}
}
SHOW INDEX FROM tbl_name;
ALTER TABLE tbl_name DROP {INDEX | KEY} index_name;
注意删除主键索引,如果主键自增那么必须先修改主键自增
ALTER TABLE tbl_name MODIFY id bigint unsigned;
ALTER TABLE tbl_name DROP PRIMARY KEY;
expain出来的信息有10列,分别是id、select_type、table、type、possible_keys、key、key_len、 ref、rows、Extra
概要描述:
- id:选择标识符
- select_type:表示查询的类型。
- table:输出结果集的表
- partitions:匹配的分区
- type:表示表的连接类型
- possible_keys:表示查询时,可能使用的索引
- key:表示实际使用的索引
- key_len:索引字段的长度
- ref:列与索引的比较
- rows:扫描出的行数(估算的行数)
- filtered:按表条件过滤的行百分比
- Extra:执行情况的描述和说明
1、id相同时,执行顺序由上至下
2. 如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行
3. id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行
查询中每个select子句的类型*
显示这一步所访问数据库中表名称(显示这一行的数据是关于哪张表的),有时不是真实的表名字,可能是简称,例如上面的e,d,也可能是第几步执行的结果的简称
对表访问方式,表示MySQL在表中找到所需行的方式,又称“访问类型”。
常用的类型有: ALL、index、range、 ref、eq_ref、const、system、NULL(从左到右,性能从差 到好)
列显示MySQL实际决定使用的键(索引),必然包含在possible_keys中
如果没有选择索引,键是NULL。要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用 FORCE INDEX、USE INDEX或者IGNORE INDEX。
表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度(key_len显示的值为索引字段的 最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的)
不损失精确性的情况下,长度越短越好
列与索引的比较,表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值
估算出结果集行数,表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取 的行数
该列包含MySQL解决查询的详细信息,有以下几种情况:
总结: • 部分统计信息是估算的,并非精确值
• EXPALIN只能解释SELECT操作,每个查询最好达到range级别,**
修改my.ini配置文件,重启mysql服务
log-output=TABLE # 默认FILE修改为TABLE
slow-query-log=1 # 是否开启满查询
slow_query_log_file="LAPTOP-VRG623PM-slow.log" # 慢查询日志存放路径 long_query_time=0.5 # 慢查询时间 查询慢查询日志
select *, convert(sql_text using utf8) AS query_sql from mysql.slow_log;