(102)mysql优化之使用索引优化查询

概述

索引是数据库优化中最常用的也是最重要的手段之一。该篇看看索引的分类,使用场景,不能使用的场景等。

索引分类

索引是在mysql存储引擎中实现的,而不是在服务器层实现的。索引每种存储引擎的索引不一定相同。mysql支持4种索引:

  • B-tree索引:最常见索引,大部分引擎都支持B树索引。
  • full-text索引:全文索引。
  • hash索引:只有memory引擎支持。
  • R-Tree索引:空间索引是myisam的一种特殊索引,使用比较少。

衍生索引:主键,唯一索引,组合索引,前缀索引等。hash索引适合key-value查询(等值查询),不适合范围查询。
|索引|MYISAM引擎|InnoDB引擎|Memory引擎|
|-----------|
|B-tree索引|支持|支持|支持|
|full-text索引|支持|-|-|
|hash索引|-|-|支持|
|R-tree索引|支持|-|-|

使用索引的典型场景

1.匹配全值(match the full value)

对索引中所有列都指定具体值,即对索引中的所有列都有等值匹配的条件。

#设置组合索引(rental_date,inventory_id,customer_id)为唯一索引。
EXPLAIN SELECT * FROM rental 
WHERE rental_date='2005-05-25 17:22:10' 
  AND inventory_id=373 
  AND customer_id=343;
匹配全值

2.匹配值的范围查询(match a range of values)

对索引值进行范围查找。

#设置索引idx_fk_customer_id(customer_id)
EXPLAIN SELECT * FROM rental WHERE customer_id >= 373 AND customer_id < 400;
范围查询

3.匹配最左前缀(match a leftmost prefix)

仅仅使用索引中的最左边列进行查询。比如组合索引(col1,col2,col3)能够被col1,col1+col2,col1+col2+col3的等值查询利用到的。

#创建索引idx_payment_date(payment_date,amount,last_update);

EXPLAIN SELECT * FROM payment WHERE payment_date='2006-02-14 15:16:03' AND last_update = '2006-02-15 22:12:32';
匹配最左前缀

从结果可以看出利用了索引,但又row为182行,所有只使用了部分索引。

EXPLAIN SELECT * FROM payment WHERE amount=3.98 AND last_update='2006-02-15';
匹配最左前缀-2

从结果看出,这次查询没有利用索引,进行了全表查找。

4.仅对索引查询进行查询(index only query)

当查询列都在索引字段中。即select中的列都在索引中。

EXPLAIN SELECT last_update FROM payment WHERE payment_date='2005-08-19 21:21:47' AND amount=4.99;
不用回表查找

extra部分Using index,说明不需要通过索引回表,Using index就是平时说的覆盖索引扫描(即找到索引,就找到了要查询的结果,不用再回表查找了)。

5.匹配列前缀(match a column prefix)

仅仅使用索引的第一列,并且只包含索引第1列的开头部分进行查找。

#创建索引idx_title_desc_part(title(10),description(20));

EXPLAIN SELECT title FROM film_text WHERE title LIKE 'AFRICAN%';
匹配前缀索引

6.索引部分等值匹配,部分范围匹配

EXPLAIN SELECT inventory_id FROM rental WHERE rental_date='2006-02-14 15:16:03' AND customer_id >= 300 AND customer_id <=400;
这里写图片描述

type=ref,说明使用了索引。

7.列名是索引,column_name is null,使用索引

EXPLAIN SELECT * FROM payment WHERE rental_id IS NULL;
null

索引存在但不能使用索引的典型场景

1.以%开头的like查询

EXPLAIN SELECT * FROM actor WHERE last_name LIKE '%NI%';
这里写图片描述
#优化
EXPLAIN SELECT * FROM (SELECT actor_id FROM actor WHERE last_name LIKE '%NI%')a,actor b WHERE a.actor_id=b.actor_id;
这里写图片描述

2.数据类型出现隐式转化,不会使用索引

EXPLAIN SELECT * FROM actor WHERE last_name=1;
这里写图片描述
#使用索引
EXPLAIN SELECT * FROM actor WHERE last_name='1';
这里写图片描述

3.组合索引,不满足最左原则,不使用符合索引

EXPLAIN SELECT * FROM payment WHERE amount=3.98 AND last_update='2006-02-15 22:12:32';
这里写图片描述

4.估计使用索引比全表扫描还慢,则不要使用索引

如查询以“S”开头的标题的电影,返回记录比例比较大,mysql预估索引扫描还不如全表扫描。

EXPLAIN SELECT * FROM film_text WHERE title LIKE 'S%';
这里写图片描述

5.用or分割条件,若or前后只要有一个列没有索引,就都不会用索引

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

推荐阅读更多精彩内容