zoukankan      html  css  js  c++  java
  • 【mysql】主键、普通索引、唯一索引和全文索引的比较

    MYSQL索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存。如果没有索引,执行查询时MySQL必须从第一个记录 开始扫描整个表的所有记录,直至找到符合要求的记录。表里面的记录数量越多,这个操作的代价就越高。如果作为搜索条件的列上已经创建了索引,MySQL无 需扫描任何记录即可迅速得到目标记录所在的位置。如果表有1000个记录,通过索引查找记录至少要比顺序扫描记录快100倍。


     mysql在使用like查询中,能不能用到索引?在什么地方使用索引呢?

    在使用like的时候,如果使用‘%%’,会不会用到索引呢?
    
    EXPLAIN SELECT * FROM `user` WHERE username LIKE '%ptd_%';
    

      

    上面的结果是全表扫描,并没有使用到索引。

    只使用右边一个%的查询:
    EXPLAIN SELECT * FROM `user` WHERE username LIKE 'ptd_%';
    

    这个使用到了索引。


    只使用左边一个%的查询:

    EXPLAIN SELECT * FROM `user` WHERE username LIKE '%ptd_';
    

      

    在左边使用%时也是全表扫描,没有使用到索引。


    综上,mysql在使用like查询的时候只有使用后面的%时,才会使用到索引。


     

    总体分析

    PRIMARY, INDEX, UNIQUE 这3种是一类

    PRIMARY 主键。 就是 唯一 且 不能为空。

    INDEX 索引,普通的

    UNIQUE 唯一索引。 不允许有重复。

    FULLTEXT 是全文索引,用于在一篇文章中,检索文本信息的。

    MYSQL的索引类型:PRIMARY, INDEX,UNIQUE,FULLTEXT,SPAIAL 有什么区别?各适用于什么场合?

    举个例子来说,比如你在为某商场做一个会员卡的系统。
    这个系统有一个会员表
    有下列字段:
    会员编号 INT
    会员姓名 VARCHAR(10)
    会员身份证号码 VARCHAR(18)
    会员电话 VARCHAR(10)
    会员住址 VARCHAR(50)
    会员备注信息 TEXT

    那么这个 会员编号,作为主键,使用 PRIMARY
    会员姓名 如果要建索引的话,那么就是普通的 INDEX
    会员身份证号码 如果要建索引的话,那么可以选择 UNIQUE (唯一的,不允许重复)
    会员备注信息 , 如果需要建索引的话,可以选择 FULLTEXT,全文搜索。

    不过 FULLTEXT 用于搜索很长一篇文章的时候,效果最好。
    用在比较短的文本,如果就一两行字的,普通的 INDEX 也可以。


    创建索引使用说明

    普通索引

    这是最基本的索引类型,而且它没有唯一性之类的限制。

    创建索引,例如CREATE INDEX <索引的名字> ON tablename (列的列表);
    修改表,例如ALTER TABLE tablename ADD INDEX [索引的名字] (列的列表);
    创建表的时候指定索引,例如CREATE TABLE tablename ( [...], INDEX [索引的名字] (列的列表) );


    唯一性索引

    这种索引和前面的“普通索引”基本相同,但有一个区别:索引列的所有值都只能出现一次,即必须唯一。

    MYSQL主键:

    MYSQL主键是一种唯一性索引,但它必须指定为“PRIMARY KEY”。

    例如“CREATE TABLE tablename ( [...], PRIMARY KEY (列的列表) ); ”。但是,我们也可以通过修改表的方式加入主键,例如“ALTER TABLE tablename ADD PRIMARY KEY (列的列表); ”。每个表只能有一个主键。

    全文索引 (适合在进行模糊查询的时候使用)

    MySQL从3.23.23版开始支持全文索引和全文检索。在MySQL中,全文索引的索引类型为FULLTEXT。全文索引可以在CHAR、VARCHAR或者TEXT类型的列上创建。它可以通过CREATE TABLE命令创建,也可以通过ALTER TABLE或CREATE INDEX命令创建。对于大规模的数据集,通过ALTER TABLE(或者CREATE INDEX)命令创建全文索引要比把记录插入带有全文索引的空表更快。

    使用方法:(英文示例,中文复杂;后续更新)

    语句介绍:WHERE MATCH(COLUMN_NAME) AGAINST('KEY_WORD1,KEY_WORD2' IN BOOLEAN MODE)
    索引名称:FULLTEXT
    支持类型:char、varchar、text
    以下依次是增、删、查全文索引示例:
    alter table xxf_witkey_article ADD FULLTEXT username(art_title);
    
    DROP INDEX username ON xxf_witkey_article;
    
    SELECT * FROM `xxf_witkey_article` WHERE MATCH(art_title) AGAINST('kkkk');
    

      

    单列索引与多列索引

    创建索引,例如CREATE UNIQUE INDEX <索引的名字> ON tablename (列的列表);
    修改表,例如ALTER TABLE tablename ADD UNIQUE [索引的名字] (列的列表);
    创建表的时候指定索引,例如CREATE TABLE tablename ( [...], UNIQUE [索引的名字] (列的列表) 
    );

     

     
  • 相关阅读:
    HOJ 2139 Spiderman's workout(动态规划)
    FZU 2107 Hua Rong Dao(dfs)
    Java 第十一届 蓝桥杯 省模拟赛 计算机存储中有多少字节
    Java 第十一届 蓝桥杯 省模拟赛 计算机存储中有多少字节
    Java 第十一届 蓝桥杯 省模拟赛 计算机存储中有多少字节
    Java 第十一届 蓝桥杯 省模拟赛 合法括号序列
    Java 第十一届 蓝桥杯 省模拟赛 合法括号序列
    Java 第十一届 蓝桥杯 省模拟赛 合法括号序列
    Java 第十一届 蓝桥杯 省模拟赛 无向连通图最少包含多少条边
    Java 第十一届 蓝桥杯 省模拟赛 无向连通图最少包含多少条边
  • 原文地址:https://www.cnblogs.com/xinruyi/p/11333939.html
Copyright © 2011-2022 走看看