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语句后的不适合创建
    image.png
    2.认真考虑数据列基数
    列的基数是指他所容纳的所有的非重复值的个数,列的基数越高,索引的效果就越好
    3.索引短小值
    索引列应该选用较小的数据类型
    短小值可以让比较操作更快,从而加快索引速度
    短小值可以让索引短小,从而减少对磁盘I/O请求
    值越小,MYSQL内存容纳的就越多
    image.png
    4.前缀索引
    如果索引列中大多数值的前缀都是相同的则可以使用,类似短小值索引
    5.最左前缀
    创建多个列的复合索引时,实际上会创建多个索引
    6.不要建立过多的索引
    7.参与比较的索引类型保持匹配
    8.利用慢查询日志找出性能低劣的查询