4)MySQL索引优化

索引优化

1. 尽量全值匹配

当建立索引后,能再where条件中使用索引列,就尽量使用。
例如 alter table staffs add index idx_staffs_nameAgePos(name,age,pos);
尽量加上三个列在where里,EXPLAIN SELECT * FROM staffs WHERE NAME = 'July' AND age = 25 AND pos = 'dev'

2. 最佳左前缀法则

如果是复合索引,就要遵守最左前缀法则,意思是:查询从最左前列开始,并且不跳过索引中的列。
同样索引列是name,age,pos。
EXPLAIN SELECT * FROM staffs WHERE NAME = 'July'; (会用索引NAME )
EXPLAIN SELECT * FROM staffs WHERE NAME = 'July' AND AGE = 25;(会用索引NAME 和AGE)
EXPLAIN SELECT * FROM staffs WHERE NAME = 'July' AND POS= 'dev'(只会用到NAME,因为跳过了AGE)
EXPLAIN SELECT * FROM staffs WHERE AGE = 25 AND POS='dev';(不会用索引,因为最左前列NAME没有使用)

3. 不在索引列上做任何操作

不在索引列上(计算,函数,自动或者手动的进行类型转换),会导致索引失效。
EXPLAIN SELECT * FROM staffs WHERE left(NAME,4) = 'July';(不会用到索引)

4. 范围条件放最后(是指索引定义顺序的最后)

EXPLAIN SELECT * FROM staffs WHERE NAME = 'July' and age =22 and pos='manager'
中间有范围查询会导致后面的索引列全部失效(按照name,age,pos,索引创建的顺序,age后面的POS会失效)
EXPLAIN SELECT * FROM staffs WHERE NAME = 'July' and age >22 and pos='manager' (索引只会用到NAME 和AGE列)
对于in条件查询,如果索引没有生效,使用in不会有影响;如果索引有效,使用in则会进行全表扫描
EXPLAIN SELECT * FROM staffs WHERE NAME = 'July' and age = 22 and pos in ('a','b' ) (name,age,pos索引都存在,没有跳过的,pos使用in则会导致全表扫描)
EXPLAIN SELECT * FROM staffs WHERE NAME = 'July' and pos in ('a','b' ) (索引age跳过了,所以pos不会生效,加in不会对索引有影响)

5. 尽量使用覆盖索引

覆盖索引(只访问索引的查询(索引列和查询列一致)),而尽量避免 select *

6. 不等于要慎用

在使用不等于(!= 或者<>),会导致索引失效
EXPLAIN SELECT * FROM staffs WHERE NAME <> 'July';
如果定要需要使用不等于,请用覆盖索引
EXPLAIN SELECT name,age,pos FROM staffs WHERE NAME != 'July';

7. NULL和Not NULL要慎用

|-- 在字段为NOT NULL的情况下,如果使用 is null 或者 is not null,会导致索引失效。解决方案(覆盖索引)
EXPLAIN select * from staffs where name is not null (索引失效)
EXPLAIN select name,age,pos from staffs where name is not null (可以使用索引)
|-- 在字段为可以为NULL的情况下,使用IS NULL,索引正常;使用 IS NOT NULL,则索引失效。(解决方案同上,覆盖索引)

8. LIKE查询要当心

like以通配符开头('%abc...')mysql索引失效会变成全表扫描的操作。
EXPLAIN select * from staffs where name like '%july%' (索引失效,一定要用的话,用覆盖索引)
EXPLAIN select * from staffs where name like 'july%' (可以使用索引,类似遵循最左前缀原则)

9. 字符类型加引号

EXPLAIN select * from staffs where name = 917 (索引失效)
EXPLAIN select * from staffs where name = ‘917’ (可以使用索引)

10. OR改UNION效率高

EXPLAIN select * from staffs where name='July' or name = 'z3' (索引失效,解决方案UNION或者覆盖索引)
|-- 解决方式:UNION
EXPLAIN
select * from staffs where name='July'
UNION
select * from staffs where name = 'z3'
|-- 解决方式:覆盖索引
EXPLAIN
select name,age from staffs where name='July' or name = 'z3'

除了索引优化之外,还有一些查询优化的技巧:

1. 延迟关联

select c1 from table where c2='M' order by c3 limit 100000, 10; 类似这种分页查询
可以通过延迟关联(deferred join)技术,通过覆盖索引(c2+c3)来得到所需要的主键,然后再根据这些主键关联原表获得需要的行。

select c1 
from table,  (select id from table where c2='M' order by c3 limit 100000, 10) as table2
where table.id = table2.id 
2. LIMIT 1

当查询结果只可能为1条数据的时候,加上LIMIT 1可以增加性能,MySQL数据库引擎会在找到一条数据后停止搜索,而不是继续往后查少下一条符合记录的数据。

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

推荐阅读更多精彩内容

  • 1、单表索引优化 单表索引优化分析 创建表 建表 SQL 表中的测试数据 查询案例 查询category_id为1...
    L_又不是不能用阅读 609评论 1 2
  • # 单表、两表、三表的优化案例 如何建立索引并优化 -在explain的基础上进行优化: ## 建表 create...
    bug_ling阅读 286评论 0 0
  • 一、使用索引 1.1 建表SQL 1.2 使用索引案例 全值匹配 索引 idx_staffs_nameAgePo...
    Noperx阅读 195评论 0 0
  • SQL 优化 优化实战 策略 1.尽量全值匹配 CREATE TABLE `staffs`( id int pri...
    Curtain_call阅读 183评论 0 1
  • 一、索引 1、索引的定义:排好序的用于查询数据库数据的数据结构,这些数据结构以某种方式指向数据。 影响where和...
    黑色叉腰魔头阅读 407评论 0 0