5、索引

http://www.runoob.com/mysql/mysql-index.html
http://blog.csdn.net/xluren/article/details/32746183

一、索引的介绍

索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),他们包含着对数据表里所有记录的引用指针。
●索引分为单列索引和组合索引。单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。组合索引,即一个索引包含多个列。
创建索引时,需要确保索引时应用在SQL查询语句的条件(一般作为WHERE子句的条件)。实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。

●上面都在说使用索引的好处,但过多的使用索引将会造成滥用,因此索引也会有缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、DELETE和UPDATE操作时,因为需要更新表,MYSQL不仅要保存数据,还要保存一下索引文件。
并且建立索引也占用磁盘空间的索引文件。

●索引也分为 聚合索引和非聚合索引。图书馆例子(书架号、作者名)和字典例子(拼音、偏旁)

二、索引的使用

普通索引

CREATE INDEX indexName ON mytable(username(length));

如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定length
修改表结构(添加索引)

ALTER TABLE tablename ADD INDEX indexname(columnName)

删除索引

DROP INDEX [indexName] ON mytable;

四种方式添加索引
使用ALTER 命令添加和删除索引
有四种方式来添加数据表的索引:

ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 

该语句添加一个主键(索引),这意味着索引值必须是唯一的,且不能为NULL。

ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 

这条语句创建索引的值必须是唯一(索引)的(除了NULL外,NULL可能会出现多次)。

ALTER TABLE tbl_name ADD INDEX index_name (column_list):

添加普通索引,索引值可出现多次。

ALTER TABLE tbl_name ADD FULLTEXT index_name (column1, column2):

ELECT * FROM tablename WHERE MATCH(column1, column2) AGAINST(‘xxx′, ‘sss′, ‘ddd′)

该语句指定了索引为 FULLTEXT ,用于全文索引,FULLTEXT索引仅可用于 MyISAM 表,对于大容量的数据表,生成全文索引是一个非常消耗时间非常消耗硬盘空间的做法。
文本字段上(text)如果建立的是普通索引,那么只有对文本的字段内容前面的字符进行索引,其字符大小根据索引建立索引时申明的大小来规定。
如果文本中出现多个一样的字符,而且需要查找的话,那么其条件只能是where column like '%xxx%'这样会使索引失效
此时便可以使用全文索引,上述命令将把column1和column2字段里有xxx、sss和ddd的数据记录全部查询出来。

与上述单一索引相对的组合索引
最左前缀
如果你建立了 组合索引(nickname_account_createdTime_Index) 那么他实际包含的是3个索引 (nickname) (nickname,account)(nickname,account,created_time)

在使用查询的时候遵循mysql组合索引的"最左前缀",下面我们来分析一下 什么是最左前缀:及索引where时的条件要按照建立索引的时候字段的排序方式

1、不按索引最左列开始查询(多列索引) 例如index(‘c1’, ‘c2’, ‘c3’) where ‘c2’ = ‘aaa’ 不使用索引,where c2 = aaa and c3=sss 不能使用索引

2、查询中某个列有范围查询,则其右边的所有列都无法使用查询(多列查询)

Where c1= ‘xxx’ and c2 like = ‘aa%’ and c3=’sss’ 改查询只会使用索引中的前两列,因为like是范围查询

3、不能跳过某个字段来进行查询,这样利用不到索引,比如我的sql 是

explain select * from award where nickname > 'rSUQFzpkDz3R' and account = 'DYxJoqZq2rd7' and created_time = 1449567822; 那么这时候他使用不到其组合索引.

因为我的索引是 (nickname, account, created_time),如果第一个字段出现 范围符号的查找,那么将不会用到索引,如果我是第二个或者第三个字段使用范围符号的查找,那么他会利用索引,利用的索引是(nickname),

因为上面说了建立组合索引(nickname, account, created_time), 会出现三个索引

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 在任何的数据库之中, 索引都是一种提升数据库检索性能的手段,这一点在MongoDB数据库之中同样是存在的, 在Mo...
    简人CC阅读 333评论 0赞 0
  • 一、数据库结构的设计 如果不能设计一个合理的数据库模型,不仅会增加客户端和服务器段程序的编程和维护的难度,而且将会...
    安易学车阅读 1,649评论 0赞 7
  • 之前的文章一直在规避索引的建立去优化数据库,不是不想讲,而是这个太重要,必须抽出来讲。今天我们就来研究下数据库索引...
    JackFrost_fuzhu阅读 4,876评论 0赞 70
  • 又见敦煌 “涉江而过,芙蓉千朵,诗也简单,心也简单”,有时候,一场旅行就是这样简单,一...
    耳根净阅读 520评论 0赞 0
  • 5种积极的维持亲密关系的行为: 1.肯定。肯定的言词,对对方情绪的肯定,让对方感受到自己对对方来说是重要的; 2....
    Lilly百合花阅读 618评论 0赞 0

友情链接更多精彩内容