Mysql索引的知识点
1.索引分单列索引和组合索引。单列索引,即一个索引只包含单个列,可以是主键索引(列值唯一,不可以有null)或唯一索引(列值唯一,可以为null),一个表可以有多个单列索引。 组合索引,即一个索引包含多个列,专门用于组合搜索,其效率大于索引合并。索引合并是指使用多个单列索引组合搜索。一个表上单列索引和组合索引总数建议不要超过5个。
2.创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件,如WHERE 子句的条件。
3.索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。
4.索引大大提高了查询速度,但同时会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时, MySQL不仅要保存数据,还要保存索引文件。
5. 建立索引会占用磁盘空间的索引文件;
6.Mysql目前主要有以下索引类型:FULLTEXT,HASH,BTREE,RTREE。
7. FULLTEXT:全文索引,目前只有MyISAM引擎支持。其可以在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使用,不过只有 CHAR、VARCHAR ,TEXT 列上可以创建全文索引。它是为了解决WHERE name LIKE “%word%"这类针对文本的模糊查询效率较低的问题,对文本的内容进行分词,进行搜索。
8. HASH索引:由于HASH的唯一性及类似键值对的形式,很适合作为索引。HASH索引可以一次定位,不需要像树形索引那样逐层查找,因此具有极高的效率。但是,这种高效是有条件的,即只在“=”和“in”条件下高效,对于范围查询、排序及组合索引效率不高。
9. BTREE索引是一种将索引值按一定的算法,存入一个二叉树数据结构中,每次查询都是从树的入口root开始,依次遍历node,获取leaf。这是MySQL里默认和最常用的索引类型。
10. RTREE索引在MySQL很少使用,仅支持geometry数据类型,支持该类型的存储引擎有MyISAM、BDb、InnoDb、NDb、Archive几种,RTREE的优势在于范围查找。
11. 延伸-主键索引(聚集索引):就是按照每张表的主键构造一颗B+树,同时叶子节点中存放的即为整张表的记录数据。聚集索引的叶子节点称为数据页,这个特性决定了索引组织表中的数据也是索引的一部分。
12.延伸-唯一索引(辅助索引、二级索引):非主键索引,叶子节点=键值+书签。Innodb存储引擎的书签就是相应行数据的主键索引值。
13.覆盖索引, 就是select的数据列只用从索引中就能够取得,不必从数据表中读取,即查询列要被所使用的索引覆盖。 如果一个索引包含了(或覆盖了)满足查询语句中字段[select子句]与条件[Where子句]的字段数据就是覆盖索引。不是所有类型的索引都可以成为覆盖索引。覆盖索引必须要存储索引的列,而哈希索引、空间索引和全文索引等都不存储索引列的值,所以MySQL只能使用B-Tree索引做覆盖索引。当发起一个被索引覆盖的查询(也叫作索引覆盖查询)时,在EXPLAIN的Extra列可以看到“Using index”的信息。
14.一般来说,在WHERE和JOIN中出现的列需要建立索引,但也不总是如此,因为MySQL只对<,<=,=,>,>=,BETWEEN,IN,以及某些时候的LIKE才会使用索引。
15.使用连接(JOIN)来代替子查询(Sub-Queries)- 连表时注意条件类型需一致,不要隐式转换。
16.mysql的limit语句是很方便,但是对记录很多的表并不适合直接使用,因为实践发现limit语句的查询时间与起始记录的位置成正比。优化:
(1)利用表的覆盖索引来加速分页查询;
(2)查询列多时,有两种方法,一种是id>=的形式,另一种就是利用join,如:
SELECT * FROM product WHERE ID > =(select id from product limit 900000, 1) limit 20
或
SELECT * FROM product a JOIN (select id from product limit 966666, 30) b ON a.ID = b.id