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万条数据,查看有无索引的区别