1.索引可以缩短查询的时间
索引本质上是对索引列进行了排序,避免了全表扫描,使用定位技术可以更快的查找索引值
对数据排序不能取代索引,因为不能同时按多种方式对数据进行排序,而且索引的行比表中的数据行要短,当插入或删除新值时,移动索引更快。
2.MyISAM和InnoDB中索引的区别
在MyISAM中数据行保留在数据文件中,索引值则保留在索引文件中,一个表可以有多个索引,但它们都保存在一个索引文件中。索引文件的每一个索引都有一组有序的关键字构成,这个组关键字行主要用于快速访问数据文件
InnoDB只使用一个表空间,这个表空间管理着所有的InnoDB表的数据存储和索引存储。可以通过配置使每个表都拥有自己的表空间,但是数据和索引都在同一个表空间中。
3.索引再多表连接的优势
如果多表连接时表中都没有索引,则扫描量是所有表行数的笛卡尔积。如果都配置了索引,则扫描量是第一个表的行数,对后续表都是按索引查找。
4.使用场景
索引可以用于加快对WHERE子句匹配的行进行搜索的速度,或者用于加快与另一个表里的行匹配的行进行搜索的速度
对于MIN()或者MAX()函数的查询,使用索引可以再不进行全表扫描的情况下,快速的查找到最大值和最小值
对于order by和GROUP BY子句,mysql经常使用索引来高效的完成分类和分组。
使用索引可以在不访问数据行的情况下查询数值
5.代价
索引在加快检索速度的同时,会降低索引列插入,删除,更新值的速度。就是说索引会降低大部分和写相关的操作,因为写入数据时还需要修改索引行。
使用索引会占据磁盘空间
MyISAM表中如果有大量的索引,那么索引文件的大小将比数据文件还要大
在InnoDB表中大量的索引会侵蚀数据文件的空间。
6.正确的使用索引
1。为用于搜索,排序或分组的列创建索引,而对于用于输出显示的列则不用创建索引。
对象:WHERE子句中的列,连接子句中的列,ORDER BY和GROUP BY数据中的列,跟在SELECT语句后的不适合创建
2.认真考虑数据列基数
列的基数是指他所容纳的所有的非重复值的个数,列的基数越高,索引的效果就越好
3.索引短小值
索引列应该选用较小的数据类型
短小值可以让比较操作更快,从而加快索引速度
短小值可以让索引短小,从而减少对磁盘I/O请求
值越小,MYSQL内存容纳的就越多
4.前缀索引
如果索引列中大多数值的前缀都是相同的则可以使用,类似短小值索引
5.最左前缀
创建多个列的复合索引时,实际上会创建多个索引
6.不要建立过多的索引
7.参与比较的索引类型保持匹配
8.利用慢查询日志找出性能低劣的查询
