索引相关的sql
索引相关的sql有
create index index_name on tablename(columnname);
show indexes from tablename;
drop index indexname on tablename;
explain sql; #通过查看sql的执行计划,可以看到sql使用了哪些索引
在我的mysql查询文章中已经简单测试了索引的性能
索引的目的
索引的目的就是为了优化查询。一般数据库的表有很多列,比如记录个人信息的表可能有姓名,手机号码,兴趣爱好,性别,生日等列。默认情况下我们需要查找姓名是小明的这个人的信息,那么就需要对表中的每行数据读取并比较姓名是否为小明,对于上万的数据,这个过程会十分缓慢。
优化查询最直接简单的办法就是对数据排序,然后使用二分查找法查找,这就是数据库索引的作用。如果要根据name查找一个人在表中的信息,那就在姓名这一列上面建立索引,索引建立的过程会将姓名和姓名所在的行信息取出来作为一个二元组(name,location),然后根据name排序(构建一棵红黑树),就能实现根据name快速获取数据的location了。这里location实际上是表的主键(英文是primary key,每个表都有主键,如果表没有显示定义主键,数据库也会自动创建隐含的主键),数据库根据主键和真实的location(数据的在磁盘上的存放位置)构建一个包含二元组(primary key, real location)的红黑树,这样就可以根据主键快速定位数据在磁盘上的位置。
在mysql的实现中,索引是多叉树,而不是二叉树,这是因为磁盘的读取速度和cpu的计算速度差很多,所以要考虑尽量减少磁盘的读取。每次innodb读写磁盘都是以16KB为单位,cpu在16KB的内存里面查找一个数的速度远远快于从磁盘读取一个页的速度。
主键
主键不能有重复值且不为null;主键也是索引,特殊之处在于表中数据是按照主键的顺序在磁盘上存放的。普通索引中存放了主键值,通过普通索引找到主键值,然后通过主键索引定位数据在磁盘的位置。所以主键索引又被称为一级索引,普通索引被称为二级索引。