Mysql常见四种索引的使用

提到MySQL优化,索引优化是必不可少的。其中一种优化方式 ——索引优化,添加合适的索引可以让项目的并发能力和抗压能力获得明显的提高。mysql

咱们知道项目性能的瓶颈主要是在"查(select)"语句,要提高"查"这一性能,mysql索引是必不可少的。接下来总结一下mysql常见的四种索引算法

 

一. 四种索引(主键索引/普通索引/全文索引/惟一索引)sql

1.索引的添加 数据库

1.1主键索引的添加数据结构

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

 

create table a(
id int primary key auto_increment,
name varchar(20) not null default ''
);
//这里id就是表的主键

若是当建立表时没有指定主键索引,也能够在建立表以后添加:性能

alter table table_name add primary key (column name);mysql索引

 

 

1.2普通索引优化

普通索引通常是在建表后再添加的,this

create index 索引名 on table_name(column1,column2);

alter table table_name add index 索引名(column1,column2);

 

 

 

1.3全文索引

首先,全文索引主要针对文本文件,好比文章,标题,全文索引只有MyISAM有效(mysql5.6以后InnoDB也支持了全文索引)

create table c(
id int primary key auto_increment ,
title varchar(20),
content text,
fulltext(title,content)
)engine=myisam charset utf8;

insert into c(title,content) 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 c where content like "%mysql%";

这里并不会使用全文索引,能够用explain进行查看。正确用法:

select *  from c where match(title,content) against ('MYSQL');

 

备注:

1.  在mysql中fulltext 索引只针对 myisam生效

2.  mysql本身提供的fulltext针对英文生效->sphinx(coreseek)技术处理中文

3.  使用方法是 match(字段名..) against(‘关键字’)

 

1.4惟一索引

create table d(id int primary key auto_increment , name varchar(32) unique)

d表中name就是惟一索引,惟一索引能够有多个null,不能是重复的内容

 

相比主键索引,主键字段不能为null,也不能重复

 

2. 查询索引

show indexes from table_name;

show keys from table_name;

3.删除索引

alter table table_name drop index 索引名;

 

二. 索引的机制

2.1 为何咱们添加完索引后查询速度为变快?

传统的查询方法,是按照表的顺序遍历的,不论查询几条数据,mysql须要将表的数据从头至尾遍历一遍

在咱们添加完索引以后,mysql通常经过BTREE算法生成一个索引文件,在查询数据库时,找到索引文件进行遍历(折半查找大幅查询效率),找到相应的键从而获取数据

2.2 索引的代价

1. 建立索引是为产生索引文件的,占用磁盘空间

2. 索引文件是一个二叉树类型的文件,可想而知咱们的dml操做一样也会对索引文件进行修改,因此性能会降低

2.3 在哪些column上使用索引?

1 .较频繁的做为查询条件字段应该建立索引 

2. 惟一性太差的字段不适合建立索引,尽管频繁做为查询条件,例如gender性别字段

3. 更新很是频繁的字段不适合做为索引

4.不会出如今where子句中的字段不应建立索引

总结: 知足如下条件的字段,才应该建立索引.

a: 确定在where条常常使用 b: 该字段的内容不是惟一的几个值 c: 字段内容不是频繁变化

 

三.索引使用注意事项

 

1.对于建立的多列索引,只要查询条件使用了最左边的列,索引通常就会被使用。

好比咱们对title,content 添加了复合索引

select * from table_name where title = 'test';会用到索引

select * from table_name where content = 'test';不会用到索引

2.对于使用like的查询,查询若是是 ‘%a’不会使用到索引 ,而 like 'a%'就会用到索引。最前面不能使用%和_这样的变化值

3.若是条件中有or,即便其中有条件带索引也不会使用。

4.若是列类型是字符串,那必定要在条件中将数据使用引号引用起来。

 

 

四.如何查看索引使用的状况:

show status like‘Handler_read%’;

注意: 

handler_read_key:这个值越高越好,越高表示使用索引查询到的次数。

handler_read_rnd_next:这个值越高,说明查询低效。

相关文章
相关标签/搜索