数据库索引与提高
1.索引的分类
索引是在存储引擎中实现的,也就是说不通的存储引擎,会使用不同的索引,MyISAM 和 InnoDB 存储引擎:
只支持 B-tree 索引。
MEMORY / HEAP 存储引擎: 支持Hash 和 B - tree 索引
Mysql 的索引分为单列索引(主键索引,唯一索引,普通索引)和组合索引
单列索引: 一个索引值包含一个列,一个表可以有多个单列索引
组合索引: 一个组合索引包含两个或两个以上的列
1.1 普通索引
最基本的索引,没有任何限制,MyISAM 中默认的B-tree类型的索引,也是我们大多数情况下用到的索引
1.2 唯一索引
与普通索引类似,不同的就是索引列必须唯一,但允许有空值,如何是组合索引,则列值的组合必须唯一
1.3 全文索引 (FULLTEXT )
FullText 索引仅可作用域MYISAM表,他们可以从char,varchar,或者text 列中作为 create table 语句的一部分被创建,或是随后使用Alter table 或者 create index 被添加,对于较大的数据集,将你的资料输入一个没有fullText 索引的表中,然后创建索引,其速度比把资料舒服现有fullText 的速度更快,不过切记,对于大容量的数据库,生成全文索引是一个非常消耗时间非常消耗磁盘空间的做法。
1.4. 单列索引、多列索引
多个单列索引与单个多列索引的查询效果不同,因为执行查询时,MySQL只能使用一个索引,会从多个索引中选择一个限制最为严格的索引。
1.5. 组合索引(最左前缀)
平时用的SQL查询语句一般都有比较多的限制条件,所以为了进一步榨取MySQL的效率,就要考虑建立组合索引。例如上表中针对title和time建立一个组合索引:ALTER TABLE article ADD INDEX index_titme_time (title(50),time(10))。建立这样的组合索引,其实是相当于分别建立了下面两组组合索引: –title,time –title 为什么没有time这样的组合索引呢?这是因为MySQL组合索引“最左前缀”的结果。简单的理解就是只从最左面的开始组合。并不是只要包含这两列的查询都会用到该组合索引
CREATE INDEX nickname_account_createdTime_Index ON `award`(`nickname`, `account`, `created_time`);
例如上面这个索引,我们直接根据 account 或者 created_time查询时,不会使用到改索引
也就是建立了组合索引,如果在查询的时候,不符合最左原则,该索引是会失效的,不会走这个索引
2. 使用索引需要注意的地方
在建立索引的时候应该考虑索引应该建立在数据库表中的某些列上面 哪一些索引需要建立,哪一些所以是多余的. 一般来说, 1.在经常需要搜索的列上,可以加快索引的速度 2.主键列上可以确保列的唯一性 3.在表与表的而连接条件上加上索引,可以加快连接查询的速度 4.在经常需要排序(order by),分组(group by)和的distinct 列上加索引 可以加快排序查询的时间, (单独order by 用不了索引,索引考虑加where 或加limit) 5.在一些 where 之后的 <, <=, >, >=, BETWEEN IN 以及某个情况下的like 建立字段的索引(B-TREE) 6.like语句的 如果你对nickname字段建立了一个索引.当查询的时候的语句是 nickname lick '%ABC%' 那么这个索引讲不会起到作用.而nickname lick 'ABC%' 那么将可以用到索引
也就是说使用like 进行模糊查询的时候,如何查询的那个匹配条件是用 % 开头的,该索引也会失效
7.索引不会包含NULL列,如果列中包含NULL值都将不会被包含在索引中,复合索引中如果有一列含有NULL值那么这个组合索引都将失效,一般需要给默认值0或者 ' '字符串
8.使用短索引,如果你的一个字段是Char(32)或者int(32),在创建索引的时候指定前缀长度 比如前10个字符 (前提是多数值是唯一的..)那么短索引可以提高查询速度,并且可以减少磁盘的空间,也可以减少I/0操作.
9.不要在列上进行运算,这样会使得mysql索引失效,也会进行全表扫描
10.选择越小的数据类型越好,因为通常越小的数据类型通常在磁盘,内存,cpu,缓存中 占用的空间很少,处理起来更快
3. 什么情况下不创建索引
1.查询中很少使用到的列 不应该创建索引,如果建立了索引然而还会降低mysql的性能和增大了空间需求. 2.很少数据的列也不应该建立索引,比如 一个性别字段 0或者1,在查询中,结果集的数据占了表中数据行的比例比较大,mysql需要扫描的行数很多,增加索引,并不能提高效率 3.定义为text和image和bit数据类型的列不应该增加索引, 4.当表的修改(UPDATE,INSERT,DELETE)操作远远大于检索(SELECT)操作时不应该创建索引,这两个操作是互斥的关系
4. 什么 情况下数据库索引会失效
1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)
注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引
2.对于多列索引,不是使用的第一部分,则不会使用索引, 也就是组合索引不符合最左原则,索引会失效
3.like查询是以%开头