创建索引
方法1
create table 表(
col1 int,
col2 int,
…
index | key index_name (列名)方法2
alter table 表名 ADD index
alter table student_table add index index_name(stu_id);方法3
create index index_name on 表名(列)
删除索引
方式1
alter table xx
drop primary key;ALTER TABLE 表名 DROP INDEX 索引名;
方式2
drop index index_name on 表名;
查看索引
方式1
show create table 表名 ;方式2
show index from 表名;
创建全文索引
FULLTEXT 全文索引可以用于全文搜索,并且只为 CHAR 、VARCHAR、TEXT 列创建索引。索引总是对整个列进行,不支持局部(前缀)索引
create table table_1(
id int not null,
info varchar(255),
FULLTEXT INDEX | key fultxt_idx_info(info)
) engine=Myisam;
create table papers (
id int unsigned not null auto_increment,
title varchar(200), defualt null,
content text,
primary key( id ),
fulltext key title (title,content)
)engine = innodb default charset=utf8;lile 方式查询:
select * from papers where content like ‘%查询字符串%’;全文索引 用 match+against 方式查询:
select * from papers where match(title,content) against (‘查询字符串’);
- 全文索引比like + % 快N倍,但是可能存在精度问题;
- 如果需要全文索引的是大量数据,建议先添加数据,再创建索引。
MySQL8.0 索引新特性
索引降序
mysql8.0 支持降序索引,而且仅限于InnoDB 存储引擎
8.0 之前创建的仍然是升序索引,使用时进行反向扫描。这大大降低了数据库的效率。
方式1 创建表
create table ts1(a int ,b int ,index idx_a_b(a asc,b desc)
方式2 alter方式
alter table ts1
add index id_a_b(a asc,b desc);
方式3 create index
create index idx_a_b on ts1(a asc,b desc)
隐藏索引
在mysql5.7 之前,只能通过显示的方式删除索引,才能让索引不起作用,如果发现删错了,只能通过显示创建索引的方式将删除的索引创建回来。如果数据表中的数据量非常大,或者数据表本身比较大,这种操作就会消耗系统过多的资源,操作成本非常高
在mysql8.0 开始 支持 隐藏索引(invisible indexes),只需要将待删除的索引设置为隐藏索引,使查询优化器不再使用这个索引(即使使用force index 强制索引,优化器也不会使用该索引),确认将索引设置为隐藏索引后系统不受任何响应,就可以彻底删除索引。这种通过先将索引设置为隐藏索引,再删除索引的方式就是软删除。
同时,如果你想验证某个索引删除之后的查询性能影响,就可以暂时先隐藏该索引
注意
主键不能被设置为隐藏索引。当表中没有显式主键时,表中第一个唯一非空索引会成为隐式主键,也不能设置为隐藏索引
索引默认是可见的,在 使用create table 、create index 、alter table 等语句是可以通过visible或invisible关键词设置索引的可见性
创建隐藏索引
create table book(
id int primariy key auto_increment,
book_name varchar(20) not null,
price double,
index index_book_name(book_name) visible | Invisible;
创表之后 方法1
alter table book_1
add index index_book(col) visible | invisible;
创表之后 方法2
create index index_name on 表(col) visible | Invisible;
修改索引的可见性
alter table 表 alter index index_name invisible | visible;
隐藏索引 注意点
当索引被隐藏时,它的内容仍然是和正常索引一样实时更新的,如果一个索引需要长期被隐藏,那么可以将其删除,因为索引的存在会影响插入、更新和删除的性能。
是隐藏索引对查询优化器可见
mysql 8.0 可以通过use_invisiable_indexes设置为off(默认值),优化器会忽略隐藏索引,如果设置On,即使隐藏索引不可见,优化器在生成执行计划时仍会考虑使用隐藏索引。
查看优化器的开关设置
select @@optimizer_switch \G
设置隐藏索引对优化器可见
set session optimizer_switch=‘use_invisible_indexes=on’;