数据库索引的简单例子:
create table stu
(
id int AUTO_INCREMENT not null comment '学号',
name varchar(20) DEFAULT ' ' not null comment '姓名',
sex varchar(2) DEFAULT '男' not null comment '性别',
age int DEFAULT 10 not null comment '年龄',
primary key(id),
key 'idx' (id,name,sex)
) engine=innoDB default charset=utf8 comment='学生信息'
select * from stu where id=10 -- 使用了索引
select * from stu where name='张三' and sex='男' --不适用索引
select * from stu where name='张三' and id=10 --使用了索引
select * from stu where id>10 and name='张三' --只有id走索引, 范围字段会结束索引对范围后面索引字段的使用
数据库的索引:
- 聚集索引(主键索引):在数据库里面,所有的行数都会按照主键索引进行排序
- 非聚集索引:给普通字段加上索引。
- 联合索引:好几个字段组成的索引。
联合索引的最左前缀原则
在上述索引中,id 位于最左边,所以搜索条件中出现 id 则满足。
注意这里说的满足是满足最左前缀原则,当有索引最左边的 id 出现在条件中,mysql内部会自动调整 id 在最左边并执行。
--创建索引
--1. 可以在创建表的时候直接指定
--2. create index
--创建简单索引
create index index_name on table_stu(id)
--创建联合索引
create index index_name on table_stu(id,name)
--创建唯一索引
create unique index index_name on table_stu(id)
--查看某张表的所有索引
select * from all_ind_columns where table_name='表名'
--删除索引
drop index 索引名称
drop index 索引名称 on 表名
1. 索引的概念:
一种帮助系统能更快查找数据的数据结构。
2. 索引的作用:
- 数据库利用各种快速定位技术、能够大大加快查询速度。这是创建索引的主要原因。
- 当表很大 或者 设计多个表的数据查询, 使用索引可以成千上万倍提高查询速度。
- 可以降低数据库的IO成本,并且索引还可以降低数据库的排序成本。
- 通过创建唯一性索引,可以保证数据表中每一行数据的唯一性。
- 可以加快表与表之间的连接。
- 在使用分组和排序时,大大减少分组和排序的时间。
- 建立索引在搜索和恢复数据库中的数据时能显著提高性能。
3. 索引的缺点:
- 索引需要占用额外的磁盘空间。
- 进行增删改数据的时候会花费更多的时间,这是由于索引本身也需要更新。
仅经常被搜索的列(以及表)上面建立索引
4. 创建索引的原则:
表的主键、外键必须有索引。主键有唯一性,外键关联的是主表的主键,查询时可以快速定位。
记录数超过300行的表应该有索引。如果没有索引,每次查询都需要把表遍历一遍,会严重影响数据库的性能。
经常与其他表进行连接的表,连接字段上应该建立索引。
唯一性太差的字段不适合建立索引。
更新太频繁的字段不适合建立索引。
经常出现在where 子句中的字段,特别是大表的字段,应该建立索引。
经常使用group by 、order by 的字段应该建立索引。
索引应该建立在选择性高的字段上。
索引应该建立在小字段上,对于大的文本字段、甚至是超长字段,不要建立索引。
5. 什么情况适合创建索引
小字段
唯一性强的字段
更新不频繁,但是查询频繁的字段
表记录超过300行
主键、外键、唯一键