美文网首页
5、索引

5、索引

作者: 24_yu | 来源:发表于2017-11-06 23:04 被阅读0次

    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), 会出现三个索引

    相关文章

      网友评论

          本文标题:5、索引

          本文链接:https://www.haomeiwen.com/subject/ioplmxtx.html