MySQL 索引和索引优化分析

索引简介

介绍

  • 索引(index)是帮助MySQL高效获取数据的数据结构。
  • 可以理解为:索引是数据结构;或者排好序的快速查找数据结构。
  • 索引本身很大,不可能全部存在内存中,是以索引文件的形式存储在磁盘上。

优缺点

  • 优点

  1. 提高数据检索效率,降低数据库的io成本。
  2. 通过索引对数据排序,降低排序成本,降低cpu消耗。
  • 缺点

  1. 降低了更新表的速度,如insert、update和delete。
  2. 索引也是一张表,该表保存了主键和索引字段,并指向实体表的纪录,所以占用了更多空间。

索引结构

  • BTree

BTree的特点:
(1)所有键值分布在整个树中。
(2)任何关键字出现且只出现在一个节点中。
(3)搜索有可能在非叶子节点结束。
(4)在关键字全集内做一次查找,性能逼近二分查找算法。

B-Tree存在的问题:
(1)每个节点中有key,也有data,而每一个页的存储空间是有限的,如果data数据较大时就会导致每个节点(即一个页)能存储的key的数量很小
(2)当存储的数据量很大时,同样1会导致B-Tree的深度较大,增加查询时的磁盘I/O次数,进而影响查询效率

image.png
image.png
  • BTree

B+Tree与BTree的不同在于:
(1)所有关键字存储在叶子节点,非叶子节点不存储真正的data。
(2)为所有叶子节点增加了一个链指针。


image.png
image.png
  • 总结:

因为计算机内存问题和查询效率问题,mysql选择B+Tree

索引分类

  • 基本语法

# 创建索引
CREATE  [UNIQUE ]  INDEX [indexName] ON table_name(column)) 
# 删除索引
DROP INDEX [indexName] ON mytable; 
# 查看索引
SHOW INDEX FROM table_name\G
  • 单一索引

# 随表一起建索引:
create table `t_emp`(
    `id` int(11) not null auto_increment,
    `name` varchar(20) default null,
    `age` int(3) default null,
    `deptId` int(11) default null,
    `empno` int not null,
    primary key (`id`),
    key 'idx_dept_id' ('deptId')    --创建索引
)engine=innodb auto_increment=1 default charset = utf8;
  
# 单独建单值索引:
create index idx_name on t_emp(name);
 
# 删除索引:
drop index idx_name on t_emp;
  • 唯一索引

create unique index idx_empno on t_emp(empno);
  • 主键索引

注意:新建的表可以创建主键索引,已有数据的表不能新建索引。

# 随表一起建索引:
CREATE TABLE customer (id INT(10) UNSIGNED  AUTO_INCREMENT ,customer_no VARCHAR(200),customer_name VARCHAR(200),
  PRIMARY KEY(id) 
);
   
CREATE TABLE customer2 (id INT(10) UNSIGNED   ,customer_no VARCHAR(200),customer_name VARCHAR(200),
  PRIMARY KEY(id) 
);
 
# 单独建主键索引:
ALTER TABLE customer add PRIMARY KEY customer(customer_no);  
 
# 删除建主键索引:
ALTER TABLE customer drop PRIMARY KEY ;  
 
# 修改建主键索引:
必须先删除掉(drop)原索引,再新建(add)索引
  • 复合索引

create index idx_age_deptid_name on t_emp(age,deptId,name);
image.png

索引创建条件

  • 需要创建索引的条件

  1. 主键自动建立唯一索引 。
  2. 频繁作为查询条件的字段应该创建索引(where 后面的语句)。
  3. 查询中与其它表关联的字段,外键关系建立索引。
  4. 单键/组合索引的选择问题,who?(在高并发下倾向创建组合索引)。
  5. 查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度
  6. 查询中统计或者分组字段
  • 不需要创建索引的条件

  1. 表记录太少
  2. 经常增删改的表或者字段
  3. Where条件里用不到的字段不创建索引
  4. 过滤性不好的不适合建索引

Explain(索引创建的标尺)

介绍

使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是
如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈。

使用方式

#Explain + SQL语句
explain select c.name, ab.name ceoname from t_emp c left join (
    select a.name,b.id from t_emp a inner join t_dept b on a.id = b.CEO
) ab on c.deptId = ab.id;

可以得到以下字段


image.png

字段解释

id字段

select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序。
每个id号,表示一趟独立的查询。一个sql 的查询趟数越少越好,即id号越少越好。


image.png

select_type字段

查询的类型,主要是用于区别普通查询、联合查询、子查询等的复杂查询。


image.png

table字段

显示这一行的数据是关于哪张表的。

type字段

字段类型

image.png

type显示的是访问类型,是较为重要的一个指标,结果值从最好到最坏依次是:
(1)system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
(2)system>const>eq_ref>ref>range>index>ALL
一般来说,得保证查询至少达到range级别,最好能达到ref。


image.png

possible_keys字段

显示可能应用在这张表中的索引,一个或多个。
查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询实际使用。

key字段

实际使用的索引。如果为NULL,则没有使用索引。
查询中若使用了覆盖索引,则该索引和查询的select字段重叠。

key_len字段

表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度。
key_len字段能够帮你检查是否充分的利用上了索引。

ref字段

显示索引的哪一列被使用了,如果可能的话,是一个常数。哪些列或常量被用于查找索引列上的值。

rows字段

rows列显示MySQL认为它执行查询时必须检查的行数。越少越好。

Extra字段

image.png

参考内容

MySQL索引原理及慢查询优化

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,252评论 6 516
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,886评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,814评论 0 361
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,869评论 1 299
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,888评论 6 398
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,475评论 1 312
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 41,010评论 3 422
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,924评论 0 277
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,469评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,552评论 3 342
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,680评论 1 353
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,362评论 5 351
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 42,037评论 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,519评论 0 25
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,621评论 1 274
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,099评论 3 378
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,691评论 2 361