MySQL:索引
索引
一、定义
索引是对数据库表一列或多列的值进行排序的一种结果
二、优点
- 保证数据的唯一性
- 加快数据查询速度
- 加速表与表之间的连接
- 再使用分组和排序的子句进行数据查询时。可以减少查询中分组和排序的时间
三、缺点
- 创建索引和维护索引耗费时间长
- 占用磁盘空间
四、设计原则
- 索引并非越多越好
- 对数据量小的表,尽量不使用索引
- 避免对经常更新的表进行过多的索引,并且索引中的列尽可能的少
- 在条件表达式中经常用到的不同值较多的列上建立索引,在不同值少的列上不要建立索引
五、索引不能使用
- 使用like关键字查询语句的时候,如果匹配字符串的第一个字符为“%”,索引不起作用,只有“%”不在第一个位置索引才会起作用;2.6索引不起作用
- 使用or关键字的查询语句的时候,查询条件中只有OR关键字,且OR前后的两个条件中的列都是索引时,查询才起作用;
- 使用多列索引的查询语句的时候,只有查询条件中使用了这些字段的第1个字段时,索引才被使用;
- 例:CREATE INDEX index_id_price ON fruits(f_id,f_price);
- 起作用:explain select * from fruits where f_id=’12’;
- 不起作用:explain select * from fruits where f_price=5.2;
- 例:CREATE INDEX index_id_price ON fruits(f_id,f_price);
六、创建索引
1、建表时创建索引
1.1总语法:
create table 表名(
字段名 字段类型
……
[unique|fulltext|spatial]----唯一索引|全文索引|空间索引
[index|key]------------------指定创建的索引
[索引名称]
(指定表中的字段[length]1,……,表中的字段n)
length表示可选参数,表示索引长度,只有字符串类型的字段才能指定索引长度
[ASC|DESC]-------------------升序,降序
)
1.2实例
- 普通索引/单列索引
注意:
查询时遵从“最左前缀”,即利用索引最左边的列集来匹配行。如:由id,name,age,这3个字段构成的索引,索引行中按id/name/age的顺序存放,索引可以搜索下面的字段组合(id,name,age)、(id,name)或者id。不能搜索age或者(name,age),因为他们不构成索引最左面的前缀
- 唯一索引----索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一
注意:
(1)引擎必须改为MyISAM,且字段类型只能是char、varchar和text列。
(2)索引总是对整个列进行,不支持局部(前缀)索引
- 空间索引-------引擎必须改为MyISAM,且空间类型的字段必须为空
create table book6(
id int,
name varchar(5),
g geometry not null,
spatial index (g)
)
engine=myisam
;
2、在以创建的表上添加索引
- alter table 表名 add 索引基本语句
- create 索引限制index 索引名 on 表名(指定表中的字段);
六、查询索引
1、索引是否成功建立
show create table book2\G;
*************************** 1. row ***************************
Table: book2
Create Table: CREATE TABLE `book2` (
`id` int(11) DEFAULT NULL,
`name` varchar(4) DEFAULT NULL,
KEY `suoyinming` (`id`)----------------成功建立
) ENGINE=InnoDB DEFAULT CHARSET=utf8
2、索引是否正在执行
- 语法:explain select 字段 from 表名 where 索引字段名=符合索引类型的索引值\G;
- 实例
mysql> explain select * from book2 where id=1990\G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE select_type:指定所使用select查询的类型,SIMPLE表示简单查询
table: book2 table:指定数据库读取的数据表的名字,按被读取的先后顺序排列
partitions: NULL
type: ref type:指定本数据表与其他数据表的联系
possible_keys: suoyinming possible_keys:给出MySQL在搜素数据记录时可选用的各个记录
key: suoyinming key:是MySQL实际选用的索引
key_len: 5 key_len:给出索引按字节计算的长度,key_len数值越小,表示越快
ref: const ref:给出关联关系中另一个数据表的数据列的名字
rows: 1 rows:表示MySQL在执行这个查询时预计会从这个数据表里读出的数据行的个数
filtered: 100.00
Extra: NULL Extra:提供关联操作的相关信息
3、查看指定表中的索引
- 语法:show index from 表名\G
- 实例:
*************************** 1. row ***************************
Table: book Table: 表示创建的表
Non_unique: 1 Non_unique:表示索引是否唯一,1表示非唯一索引,0表示唯一索引
Key_name: id Key_name: 索引名
Seq_in_index: 1 Seq_in_index:表示该字段在索引的位置,单列索引该值为1,组合索引为每个字段在索引定义中的顺序
Column_name: id Column_name:表示定义索引的列字段
Collation: A
Cardinality: 0
Sub_part: NULL Sub_part:表示索引的长度
Packed: NULL
Null: YES Null: 表示该字段是否能为空值
Index_type: BTREE Index_type:表示索引类型
Comment:
Index_comment:
七、删除索引
- alter table 表名 drop index 索引名 注意:auto_increment约束字段的唯一索引不能被删除
- drop index 索引名 on 表名