×

详解 索引 优化 MySQL

MySQL优化之索引详解

jnlyseo998998 jnlyseo998998 发表于2023-03-18 01:21:02 浏览16 评论0

抢沙发发表评论

索引的概述

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

(1) 主键索引

主键索引是一种唯一性索引,但是它必须指定“PRIMARY KEY”。主键一般在创建表的时候指定,并且一张表只能有一个主键。

#创建主键索引:

默认情况下,MySQL会为主键自动添加主键索引。

也可以后期添加主键:

Alter table table_name add primary key(field_name);

#删除主键:

Alter table table_name drop primary key;

#查看索引

show index from table_name;

show keys from table_name;

(2) 全文索引

全文索引一般用于查询文本或者长内容而建立。

#全文索引的使用方法

-- 错误使用方法

select * from articles where body like '%mysql%';

-- 建立全文索引

展开全文

alter table articles add FULLTEXT index fulltext_article(body);

-- 正确使用方法

select * from articles where match (body) against('mysql');

使用全文索引的注意事项:

- MySql自带的全文索引只能用于数据库引擎为MYISAM的数据表,如果是其他数据引擎,则全文索引不会生效.

- MySQL不能对中文进行全文索引,只适用于英文.

- 使用全文索引,只能用固定的语法:match(字段名)… against(关键字).

- MySQL全文索引所能找到的默认最小长度为4个字符,并且如果查询的字符串包含停止词(常见字符),那么该停止词将会被忽略。

(3) 唯一索引

这种索引的所有值都只能出现一次,即必须唯一。

默认的,在创建表时指定字段为唯一时,自动为其创建唯一索引。

#创建唯一索引:

CREATE UNIQUE INDEX <索引的名字> ON tablename (列的列表);

ALTER TABLE tablename ADD UNIQUE [索引的名字] (列的列表);

CREATE TABLE tablename ( [...], UNIQUE [索引的名字] (列的列表) );

注意:unique字段可以为null,可以有多个null,但是如果是字符串的话只能有一个为‘’。

(4) 普通索引

普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。因此,应该只为那些最经常出现在查询条件(WHEREcolumn=)或排序条件(ORDERBYcolumn)中的数据列创建索引。只要有可能,就应该选择一个数据最整齐、最紧凑的数据列(如一个整数类型的数据列)来创建索引。

创建方式:

create index 索引名 on 表 (列1,列名2);

-- 案例

-- 未建立索引时查询 1.45s

select * from emp where ename ='MFPkFv';

-- 创建普通索引

create index index_ename on emp (ename);

-- 查询 4ms

select * from emp where ename ='MFPkFv';