1.索引的引入
思考:在图书馆中,如何找到一本书呢?
一般的应用系统,读写比例在10:1左右,而且插入操作和更新操作很少出现性能问题,遇到最多的,也是最容易出现问题的,还是一些复杂的查询操作,所以查询语句的优化显然是重中之重。当数据库中数据量很大时,查找数据会变得很慢,而索引能提高数据访问性能。主键和唯一索引,都是索引,可以提高查询速度。
2.建索引时选择列的数据类型
(1)越小的数据类型通常越好:越小的数据类型通常在磁盘、内存和CPU缓存中都只需要更少的空间,处理起来更快。
(2)简单的数据类型更好:整型数据比起字符,处理开销更小,因为字符串的比较更复杂。
(3)尽量避免null,应该指定列为not null,除非你想存储null。在MySQL中,含有空值的列很难进行查询优化,因为他们使得索引、索引的统计信息以及比较运算更加复杂。你应该用0、一个特殊的值或者一个空串代替空值。
3.索引操作
(1)索引分单列索引和组合索引
1)单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。
2)组合索引,即一个索引包含多个列
(2)查看索引
show index from tableName;
(3)创建索引
select语句中的where部分常用到那个字段就用哪个字段建索引。
create index indexName on tableName(username(length));
//tableName为表名,username为字段名,length为字段长度
create index indexName on tableName(username1(length1),username2(length2),username3(length3)...);
//为多个字段同时创建索引的做法
(4)删除索引
drop index [indexname] on tableName;
4.索引缺点
(1)虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行insert、update和delete。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。
(2)建立索引会占用磁盘空间的索引文件。
5.示例
开启运行时间监测
set profiling=1;
执行查询语句
select * from areas where atitle='北京市';
查看执行的时间
show profiles;
为表areas的atitle列创建索引
create index titleIndex on areas(atitle(20));
执行查询语句
select * from areas where atitle='北京市';
//对有索引的字段进行查找,在创建select语句的where部分时最好将等值放前,范围值放后,如下句
//where gender=0 and isDelete=0 and birtday>'1990-1-1';注意:该语句表名了datetime类型是可以比较大小的。。
//查找有索引的字段时,可以如上句一样用and,最好不要用or,这会使索引效率变得很低
再次查看执行的时间
show profiles;
可以创建一个表,插入10万条数据,查看有无索引的区别