【重点】什么是索引?
索引,类似于书籍的目录,想找到一本书的某个特定的主题,需要先找到书的目录,定位对应的页码。
MySQL中存储引擎使用类似的方式进行查询,先去索引中查找对应的值,然后根据匹配的索引找到对应的数据行。
索引有什么好处?
提高数据的检索速度,减低数据库IO成本:使用索引的意义就是通过缩小表中需要查询的记录的数目从而加快搜索的速度。
减低数据排序的成本,减低CPU消耗:索引之所以查的快,是因为先将数据排好序,若该字段正好需要排序,则正好降低了排序的成本。
索引有什么坏处?
占用存储空间:索引实际上也是一张表,记录了主键与索引字段,一般以索引文件的形式存储在磁盘上。
降低更新表的速度:表的数据发生了变化,对应的索引也需要一起变更,从而减低表的更新速度。否则索引指向的物理数据可能不对,这也是索引失效的原因之一。
索引的使用场景?
对非常小的表,大部分情况下全表扫描效率更高。
对中大型的表,索引非常有效。
特大型的表,建立和使用索引的代价随着增长,可以使用分区技术来解决。
实际场景下,MySQL分区表很少使用
对于特大型表,更常用的是“分表分库”,目前解决方案有Sharding Sphere、MyCAT等等。
索引的类型?
索引,都是实现在存储引擎层的。主要有六种类型:
普通索引:最基本的索引,没有任何约束。
唯一索引:与普通索引类似,但具有唯一性约束。
主键索引:特殊的唯一索引,不允许有空值。
复合索引:将多个列组合在一起创建索引,可以覆盖多个列。
外键索引:只有InnoDB类型的表才可以使用外键索引,保证数据的一致性、完整性和实现级联操作。
全文索引:MySQL自带的全文索引只能用于InnoDB、MyISAM,并且只能对英文进行全文索引,一般使用全文索引引擎。
常见的全文索引引擎的解决方案有Elasticsearch、Solr等等。最为常用的是Elasticsearch。
MySQL索引的“创建原则?
最适合索引的列是出现在WHERE子句中的列,或链接子句中的列,而不是出现在SELECT关键字后的列。
索引列的基数越大,索引效果越好。
索引基数(cardinality):索引中不重复的索引值的数量
例如:某个数据列包含1、3、7、4、7、3,那么它的基数就是4.
根据情况创建复合索引,复合索引可以提高查询效率。