Mysql的索引
首先,表一下索引的好处。在大数据集上,不加索引直接查询结果的时间消耗要远远大于在索引上查询。索引就好比是一本书的目录。
索引是一种特殊的文件(InnoDB数据表上索引是表空间的一个组成部分)。他们包含着对数据表里面所有记录的引用指针。举个例子,比如查询主键id = 2000000的记录。
SELECT * FROM article WHERE id=2000000
如果没加索引那么就会很爆炸,一般数据库默认都会为主键生成索引。
聚簇索引、非聚簇索引
索引分为聚簇索引和非聚簇索引两种,聚簇索引是按照数据存放的物理位置为顺序的:能够提高多行的检索速度;而非聚簇索引对于单行的索引检索很快。
举例来说,你翻到新华字典的汉字“爬”那一页就是P开头的部分,这就是物理存储顺序(聚簇索引);而不用你到目录,找到汉字“爬”所在的页码,然后根据页码找到这个字(非聚簇索引)。
聚簇索引的唯一性:因为表结构的存储顺序只能有一个,所以物理存储只能有一个顺序。显然,这让聚簇索引变得贼拉珍贵,很关键哟。。。。
初学者最大的误区:把主键自动设为聚簇索引。 主键可以是聚簇索引,但是如果主键无意义的自增字段,那么我们就可以简历自己想要的聚簇索引。
我想在时间这个维度上简历聚簇索引应该会 很好使,在查找某一范围内的时间的时候,可以直接找到起始位置和终止位置。
索引不能有包含NULL值的列
单索引不说了,复合索引(在多列上建立的索引),只要有一列含有NULL值,那么次复合索引无效。我们可以在数据库设计的时候不要让字段的默认值为NULL
使用短索引
对串列进行索引,如果可能应该指定一个前缀长度,类似字典树的思想,如果一个CHAR(255)在前N个字符内,就可以唯一区别开来,那就可以不用在整个列上建立索引。
可能导致索引失效的情况:
like语句可能不会使用索引
一般情况下不鼓励使用like,如果使用,需要注意: like "%abc%" 不会使用索引而 like "aaa%"可以使用索引。 Trie
在列上进行运算
例如,select * from users where YEAR(adddate) < 2007 将在每个行上进行运算,这将导致索引失效而进行的全表扫描。因此。可以改成: select * from users where adddate < '2007-01-01'。关于这一点可以围观:一个单引号引发的MYSQL性能损失。
MySQL只对一下操作符才使用索引
<,<=,=,>,>=,between,in,以及某些时候的like(不以通配符%或_开头的情形)。而理论上每张表里面最多可创建16个索引,不过除非是数据量真的很多,否则过多的使用索引也不是那么好玩的,比如我刚才针对text类型的字段创建索引的时候,系统差点就卡死了。
.具体的.
mysql默认使用的引擎是InnoDB引擎,InnoDB引擎底层使用的是B数结构。