当前位置 主页 > 网站技术 > 代码类 >

    MySQL数据库优化之索引实现原理与用法分析

    栏目:代码类 时间:2020-01-19 15:08

    本文实例讲述了MySQL数据库优化之索引实现原理与用法。分享给大家供大家参考,具体如下:

    索引

    什么是索引

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

    索引的分类

    主键索引

    主键是一种唯一性索引,但它必须指定为“PRIMARY KEY”。如果你曾经用过AUTO_INCREMENT类型的列,你可能已经熟悉主键之类的概念了。主键一般在创建表的时候指定,例如“CREATE TABLE tablename ( […], PRIMARY KEY (列的列表) ); ”。但是,我们也可以通过修改表的方式加入主键,例如“ALTER TABLE tablename ADD PRIMARY KEY (列的列表); ”。每个表只能有一个主键。

    创建主键索引

    主键是一种唯一性索引,但它必须指定为“PRIMARY KEY”。如果你曾经用过AUTO_INCREMENT类型的列,你可能已经熟悉主键之类的概念了。主键一般在创建表的时候指定,例如“CREATE TABLE tablename ( […], PRIMARY KEY (列的列表) ); ”。但是,我们也可以通过修改表的方式加入主键,例如“ALTER TABLE tablename ADD PRIMARY KEY (列的列表); ”。每个表只能有一个主键。

    当一张表,把某个列设为主键的时候,则该列就是主键索引

    create table aaa
    (id int unsigned primary key auto_increment ,
    name varchar(32) not null default '');
    
    

    这是id 列就是主键索引.

    create table bbb (id int , name varchar(32) not null default '');
    
    

    如果你创建表时,没有指定主键索引,也可以在创建表后,在添加, 指令:

    实例:

    alter table 表名 add primary key (列名);
    
    

    删除主键索引

    alter table articles drop primary key;
    
    

    查询索引

    desc 表名; 不能显示索引名称
    show index from 表名
    show keys from 表名
    
    

    全文索引

    创建表结构

    CREATE TABLE articles (
        id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
        title VARCHAR(200),
        body TEXT,
        FULLTEXT (title,body)
       )engine=myisam charset utf8;
    INSERT INTO articles (title,body) VALUES
       ('MySQL Tutorial','DBMS stands for DataBase ...'),
       ('How To Use MySQL Well','After you went through a ...'),
       ('Optimizing MySQL','In this tutorial we will show ...'),
       ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
       ('MySQL vs. YourSQL','In the following database comparison ...'),
       ('MySQL Security','When configured properly, MySQL ...');
    
    

    错误用法:

    select * from articles where body like '%mysql%'; 错误用法 索引不会生效

    正确用法:

    select * from articles where match(title,body) against ( 'database')

    说明:

    1.在mysql中fulltext 索引只针对 myisam生效
    2.mysql自己提供的fulltext针对英文生效->sphinx (coreseek) 技术处理中文
    3.使用方法是 match(字段名…) against('关键字')