码迷,mamicode.com
首页 > 数据库 > 详细

MySQL 索引

时间:2019-09-21 12:29:31      阅读:96      评论:0      收藏:0      [点我收藏+]

标签:sele   数据库   硬盘   tab   rem   add   最好   col   输入   

概念

索引是一种特殊的文件,它们包含着对数据表里所有记录的引用指针。

在没有索引的情况下,数据库会遍历全部数据后选择符合条件的;而有了相应的索引之后,数据库会直接在索引中查找符合条件的选项。

索引分为聚簇(多列)索引和非聚簇(单列)索引两种:
    聚簇索引是按照数据存放的物理位置为顺序的。
    聚簇索引能提高多列检索的速度,而非聚簇索引对于单行的检索很快。

普通索引

直接创建索引:
    CREATE INDEX index_name ON table(column(length))

修改表结构的方式添加索引:
    ALTER TABLE table_name ADD INDEX index_name ON (column(length))

创建表的时候同时创建索引:
    CREATE TABLE `table` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `title` char(255),
    PRIMARY KEY (`id`),
    INDEX index_title (title(255))
    );

删除索引:
    DROP INDEX index_name ON table_name


没有任何限制,MyIASM中默认的BTREE类型的索引,也是我们大多数情况下用到的索引。

唯一索引

创建唯一索引
    CREATE UNIQUE INDEX index_name ON table(column(length))

修改表结构
    ALTER TABLE table_name ADD UNIQUE index_name ON (column(length))

创建表的时候直接指定
    CREATE TABLE `table` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `title` char(255),
    PRIMARY KEY (`id`),
    UNIQUE index_title (title(255))
    );


索引列的值必须唯一,但允许有空值(注意和主键不同)。如果是组合索引,则列值的组合必须唯一。

全文索引(FULLTEXT)

利用【分词技术】等多种算法智能分析出文本文字中关键词的频率和重要性,然后按照一定的算法规则智能地筛选出我们想要的搜索结果。

MySql自带的全文索引只能对英文进行全文检索,目前无法对中文进行全文检索。
    如果需要对包含中文在内的文本数据进行全文检索,我们需要采用Sphinx(斯芬克斯)/Coreseek技术来处理中文。

字段类型:
    char、varchar和text才能使用全文索引

分词:
    全文索引以词为基础的,MySQL默认的分词是所有非字母和数字的特殊符号都是分词符。全文匹配时忽略大小写。
    MySQL规定全文搜索中被搜索的单词所在的行数大于等于被搜索的所有行数的一半时候,就将被搜索单词作为Common word,即不被显示。

创建表的时候添加全文索引:
    CREATE TABLE `table` (
    `id` int(11) NOT NULL AUTO_INCREMENT,
    `content` text,
    PRIMARY KEY (`id`),
    FULLTEXT ('content')
    );

修改表结构添加全文索引:
    ALTER TABLE article ADD FULLTEXT index_content(content)

直接创建索引:
    CREATE FULLTEXT INDEX index_content ON article(content)

查询:
    SELECT * FROM table_name WHERE MATCH (filed_1,filed_2) AGAINST ('keyword')

    SELECT * FROM table_name WHERE MATCH (filed_1,filed_2) AGAINST ('+keyword_1 -keyword_2' IN BOOLEAN MODE)
    返回包含keyword_1的数据,而包含keyword_2的数据就会被过滤掉。

    MATCH (girl_name) AGAINST ('+小红*')    //只能接在字符串后面

    "tommy huang" 可以匹配tommy huang,但是不能匹配tommy is huang

对于较大的数据集:
    将资料输入一个没有FULLTEXT索引的表中,然后创建索引,其速度比把资料输入现有FULLTEXT索引的速度更为快。
    不过切记对于大容量的数据表,生成全文索引是一个非常消耗时间非常消耗硬盘空间的做法。

组合(多列)索引(最左前缀)

ALTER TABLE article ADD INDEX index_title_time (title(50),time(10))

    建立这样的组合索引,其实是相当于分别建立了下面两组索引:
        –title,time
        –title

        因为MySQL组合索引“最左前缀”,只从最左面的开始组合,并不是只要包含这两列的查询都会用到该组合索

MySQL索引的优化

索引大大提高了查询速度,同时却会降低更新表的速度:
    如对表进行INSERT、UPDATE和DELETE。
    因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。建立索引产生会占用磁盘空间的索引文件。


1. null值反映在索引中的排列规则是:
        null值会被归到一块:
            如果是升序的话,null值被归到数据页的前端。
            如果是降序的话,null值被归到数据页的尾端。
            如果有多条null值数据,则按先来后到的顺序依次排列。

    在进行count()统计某列的记录数的时候,如果采用的NULL值,会被系统自动忽略掉,但是空值 '' 是会进行统计到其中的。

    空值('')是不占用空间的,MySQL中的(NULL)是占用空间的。

    NULL值的检索只能使用 is null / is not null / <=>,不能使用=,<,>这样的运算符(mysql中可以用a <=> NULL 表示查找 a is NULL的行)

    不建议列上允许为空,最好限制 not null,并设置一个默认值,比如0和 ''(空字符串)等

2. 使用短索引
    (如果一个索引中包含了数据类型为字符串的,那么可以为这一列指定长度。因为,对于很多的字符串来说,前几个就可以确定该字符是唯一的了。)
    CREATE INDEX index_name ON table_name (column(10));
    不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。

3. 索引列排序
    MySQL查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。
    因此数据库默认排序可以符合要求的情况下不要使用排序操作。

4. like语句操作
    一般情况下不鼓励使用like操作。like "%aaa%" 不会使用索引而like "aaa%"可以使用索引。

5. 不要在列上进行运算

建立索引的优缺点

优点:
        提高系统的性能。 

        可以加速表和表之间的连接

        通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。 

        加快数据的检索速度,这也是创建索引的最主要的原因。  

        在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
 
        通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。


缺点:
        第一、创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。 

        第二、索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间。如果要建立聚簇索引,那么需要的空间就会更大。 

        第三、当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。


适合创建索引:

       第一、在经常需要搜索的列上,可以加快搜索的速度; 

       第二、在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构; 

       第三、外键,可以加快连接的速度; 

       第四、在经常需要根据 范围进行搜索 的列上创建索引,因为索引已经排序,其指定的范围是连续的; 

       第五、在经常需要 排序 的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间; 

       第六、在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。

 
不适合创建索引:

  第一,查询中很少使用的列不应该创建索引。由于增加了索引,反而降低了系统的维护速度和增大了空间需求。 

       第二,对于那些只有很少数据值的列也不应该增加索引。增加索引,并不能明显加快检索速度。 

       第三,对于那些定义为text, image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。 

       第四,当修改性能远远大于检索性能时,不应该创建索 引。这是因为,修改性能和检索性能是互相矛盾的。
                  当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。


查看表中索引的方法:

    show index from table_name

索引的类型及创建例子:

    1.PRIMARY KEY(主键索引)

        alter table table_name add primary key ( `column` )

    2.UNIQUE 或 UNIQUE KEY(唯一索引)

        alter table table_name add unique (`column`)

    3.FULLTEXT(全文索引)

        alter table table_name add fulltext (`column` )

    4.INDEX(普通索引)

        alter table table_name add index index_name ( `column` )

    5.多列索引(聚簇索引)

        alter table `table_name` add index index_name ( `column1`, `column2`, `column3` )

参考

https://www.cnblogs.com/owenma/p/8575646.html

MySQL 索引

标签:sele   数据库   硬盘   tab   rem   add   最好   col   输入   

原文地址:https://www.cnblogs.com/loveer/p/11562246.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!