索引学习笔记

1、索引的本质是排好序的快速查找的数据结构。表查询多,增删改少,就加索引。、

    (一个字段不同记录数/总记录数,越高,建索引意义越大)

2、为什么删数据一般都是软删,status从0到-1:

    1)为了保留数据记录,供数据查询分析

    2)为了不破坏索引,否则会降低索引命中率,降低查询效率

3、索引分类:

        1)单值索引:一个索引只包含一个列,一个表可以多个单值索引,但不建议超过五个,值可以不唯一

        2)唯一索引:索引列的值必须唯一,但允许有空值

        3)复合索引:一个索引包含多个列

4、索引结构:

        1)Btree索引(java开发最常用,最需要关注)

        2)Hash索引

        3)full-text全文索引

        4)R-tree索引

5、EXPLAIN(执行计划):

        1)id:表示查询语句中,查询表的语句的执行顺序

                a)id相同时,顺序从上到下

                b)id不同时,id值越大,越先执行,NULL最小最后

        2)select_type:表示查询的类型,主要用于区别 普通查询,联合查询,子查询等的复杂查询

                a)SIMPLE:简单的select查询,不包含任何子查询或UNION

                b)PRIMARY:若存在子查询,则最外层,最后查的那个表就是

                c)SUBQUERY:在SELECT中或WHERE中的子查询语句的表

                d)DERIVED:临时表

                e)UNION:SELECT  UNION语句,UNION之后的表被标记会UNION

                f)UNION RESULT:UNION后的结果集表

        3)type(访问类型):(除了index对select和where都有要求,其余的都只对where有要求,type展示的是语句中使用到的最高级的type,也就是部分查询用到了,并不是语句中所有查询都符合。所以经常能出现,明明type级别高到range甚至ref,后面还存在Using where提示 )

                system > const > eq_ref > ref > range > index > ALL 

                system:select from 只有一行的表,一般为系统表

                const:select * from table where id = 2,用primary key或unique,只匹配一行数据

                eq_ref:select * from employee t1,department t2 where t1.deptId = t2.id,用t2的primary key或unique作为t1表的外键,t1的每个记录在t2表中只会有一条匹配

                ref:select * from table where name = "张三" 用普通index查询,匹配到多条数据

                range: between,<,>,in, like 的范围查询,在普通index上查询

                index:select id from table where  id ***,只需要扫描索引(包括primary key,unique,index)列就够返回了,且where后面的条件也只针对索引列,就算index。有多个索引的时候,也一样,只要select的所有列在任意的索引里,就是Index。

                ALL:select * from table 全表扫描,从硬盘中读取

        4)possible_keys(一个查询语句可能用到的索引,但并不一定是真的用到的索引):

        5)key(最终实际使用的索引)

        6)key_len(该列计算查询所使用的索引长度,越短越好,是通过创表时的表列的长度计算得出,并不是实际使用长度):

        7)ref:显示索引的哪一列被使用了,甚至到哪一个常量(type为const和eq_ref和ref语句就是)被使用了

        8)rows:每张表里,要能走完where后的所有条件,一共需要用到哪些行,这写行数

                    举个例子:select * from table where a = 1 and b = 2;

                    table表中,一共100条数据,a有index索引,b没有索引,a = 1有20行,a=1且b=2有5行,

                    那么这个语句,a有索引等于20次常量匹配,一共检索了20行,and后面的语句都是在这20行里筛选,所以最后的rows为20

        9)Extra:

            a)Using filesort:排序列没有索引,急需优化

            b)Using temporary:需要创建临时表来查询,急需优化,一般为group by无索引列

            c)Using index:查询的列,都在索引包含列里,无需读取实际行信息。

            d)Using where:where后的过滤条件字段,存在无法用索引的情况

6、常见索引失效原因:

        1)全局匹配all,缺索引

        2)索引没从最左列开始(全部失效),或者中间列断了(部分失效)

        3)在索引列上用函数,(自动or手动)类型转换(where bigint类型列 = “”)

        4)范围查询右边的所有查询条件都不会使用索引了

        5)减少使用select *,尽量只返回索引覆盖列

        6)使用 != 或者 <> 会导致索引失效

        7)使用is null 或者is not null 会导致索引失效

        8)like虽然type是range,但只有"%","_" 放右边的时候才是range,%只放右边(a%aa%也算,只要常量开头的,都算放右边了)的时候,虽然是范围的,但不会断索引,复合索引后面的字段照样可以继续用到索引。%放左边,索引直接失效,不说后面的不能用索引,连自身都没算用了索引。

            (在必须要%放前面的情况,怎么优化索引?只能使用index了,为了使where name like "%aa%",

            就必须建立一个以name为最左匹配的复合索引,把其余需要返回的列也包含进去。

            如 select name,age from table where name like "%aa"  可以建复合索引name_age)

        9)复合索引,用and按从左匹配,是可以用用到索引的,但是用了or,索引就失效了

7、常见误区:

    1)复合索引c1_c2_c3,虽然中间断了就只能部分使用了,但mysql会做自动转换,只要索引的所有列都在where里and了,就会自动排序。即where c2 = 1 and c3 = 2 and c1 = 3,也是ref。但是最好还是推荐按顺序写,这个字段转换顺序也是耗时耗性能的。

    2)已经确定是常量,只有一份的时候,order by就可以无视了

        如:where c1 = 1 and c2 = 2 order by c2,c3  等同于 where c1=1 and c2 = 2 order by c3

                where c1 = 1 and c2 = 2 order by c3,c2  等同于 where c1=1 and c2 = 2 order by c3

        例子中,因为c2已经是常量,索引是c1_c2_c3,即便order by c3,c2 也不会出现Using filesort 

  8、order by

    1)where和order by一起合起来,排组合索引的顺序

    2)复合索引的多列,必须都是同一种排序方向才行,否则直接using filesort

    9、group by实质上,是先排序后分组的,所以索引基本规则和order by一样

    10、看到第49

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