MySQL数据库中索引的使用
1.索引:
- 针对数据库中现有的数据,整理出一块物理存储下来的用于快速查找数据用的的东西。
- 数据库中实际数据的存储会按照某种索引,默认是按照主键(特殊的索引),并且数据物理结构上的存储顺序也是按照主键的顺序。
- 索引的创建会增大物理上的开销。
2.创建索引时如何选择列的数据类型?
- 数据类型小:越小的数据类型通常在磁盘、内存和CPU缓存中都需要更少的空间,处理起来更快。能用bit类型,不用int,能用int,不用decimal.
- 数据类型简单:整形数据比起字符,开销更小
- 尽量避免Null:含有Null的列,很难进行查询优化,你可以用0,空字符串' '或者一个特殊的值去代替。
3.什么时候考虑创建索引?
- 一开始做项目的时候,通常不会去考虑对数据库创建索引这件事,因为没有大量的数据作为基础,建立索引区别不大。当系统上线运营了一段时间后,数据库中数据量达到一定规模时我们可以进行监测,当发现检索速度变慢(比如大于100ms)时,我们就需要去分析业务逻辑中sql语句where后面的判断字段,针对这些字段建立索引进行优化。
4.建立索引对sql语句编写有什么要求?
- 把'='值的条件尽量写在前面,表示范围的比如'>'尽量写在后面,尽量避免使用'or',否则建立索引对优化查询速度已经没有意义了。比如查询语句后面 where gender = 1 and isdelete = 0 and birthday > ‘1990-1-1’,我们可以建立一个包含gender、isdelete和birthday的组合索引
5.索引操作:
-
查看索引
show index from 表名;
-
创建索引
create index 索引名 on 表名(字段名1,...);
如果只有一个字段名,表示建立单列索引;多个字段名,表示建立组合索引。如果字段为字符类型,可以在字符后面指定长度,比如students(name(20),age),也可以不指定,其他类型(int,bit)的字段不需要指定长度
-
删除索引
drop index 索引名 on 表名;
6.索引缺点:
- 虽然索引会提升查询的速度,但同时会降低更新表(insert into|delete from|update)的速度,因为更新表的时候还要保存一下索引文件
- 建立索引,会占用磁盘空间的索引文件
7.性能监测工具profiles的使用------仅限于当前数据库的本次连接,下次连接失效
示例:
-
开启运行时间监测
set profiling = 1;
-
执行查询语句
select * from areas where atitle = '北京市';
-
查看执行时间
show profiles;
-
为表areas的atitle列创建索引
create index title_index on areas(atitle(20));
-
再次执行查询语句
select * from areas where atitle = '北京市';
-
再次查看执行时间
show profiles;