索引

一、索引类型

1.普通索引:这是最基本的索引,它没有任何限制

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

3.主键索引:它是一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引;

4.组合索引:为了进一步提高效率,将两个或多个字段建到一个索引中

二、索引的区别

普通索引需要回表

三、索引的数据结构(常见模型)

1.哈希表

a.哈希表是一种以键 - 值(key-value)存储数据的结构,我们只要输入待查找的值即 key,就可以找到其对应的值即 Value。哈希的思路很简单,把值放在数组里,用一个哈希函数把 key 换算成一个确定的位置,然后把value 放在数组的这个位置。将不同的输入值通过Hash算法得到长度相同的输出。不可避免地,多个 key 值经过哈希函数的换算,会出现同一个值的情况。处理这种情况的一种方法是,拉出一个链表。 

b.哈希表的优点:随机读的速度快

c.哈希表的缺点:适合等值查询,范围查询慢;无法利用索引进行排序;不支持多联合索引的最左前缀原则;如   果有大量重复的键值,效率低,存在哈希碰撞;插入慢。

d.哈希表适合于等值查询的场景

2.有序数组

a.有序数组在等值查询和范围查询场景中的性能就都非常优秀

b.在需要更新数据的时候麻烦,往中间插入一个数据需要挪动后面的记录,所以有序数组索引只适用于静态存储引擎(不需要更改的数据)

3.B+树

a.B+树的叶子节点可以存放整行数据的主键索引,也可以存放主键值的普通索引,

b.B+ 树为了维护索引有序性,在插入新值的时候需要做必要的维护。往中间插入数值时,需要逻辑上挪动后面的数据,空出位置。如果插入的那页已满,这种情况下需要再申请一个新的数据页,然后挪动部分数据过去,这个过程称为页分裂。页分裂不仅影响性能,还影响页的利用率。

c.当相邻两个页由于删除了数据,利用率很低之后,会将数据页做合并。合并的过程,可以认为是分裂过程的逆过程。

三、索引优化

1.覆盖索引:由于覆盖索引可以减少树的搜索次数,显著提升查询性能,所以使用覆盖索引是一个常用的性能优       化手段。

2.最左前缀原作

3.索引下推:mysql5.6以后新加  

四、怎么判断你的查询使用了索引

explain 关键字 

explain执行结果的字段:

table: 这是重要的列,显示连接使用了何种类型.

type显示的是访问类型,是较为重要的一个指标,结果值从好到坏依次是:system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

一般来说,得保证查询至少达到range级别,最好能达到ref。

possible_keys:可能使用了哪个索引在该表中查找行。如果没有使用任何索引,就显示的NULL,可以用于对优化时的索引调整。 

key:显示使用的索引,如果没有使用,则显示NULL 

key_len:显示的是所使用的索引长度,如果没使用,则是NULL。当然,在使用索引的情况下,索引长度越小。效果越明显。 

ref:显示索引的哪一列被使用了,如果可能的话,是一个常数

rows:MYSQL认为必须检查的用来返回请求数据的行数

Extra:关于MYSQL如何解析查询的额外信息。

五、索引失效

1.前导模糊查询:就是模糊查询不能以%开头;

2.如果是组合索引的话,如果不按照索引的顺序进行查找,比如直接使用第三个位置上的索引而忽略第一二个位置上的索引时,则会进行全表查询

3.条件中有or; 应当尽量避免在where语句中使用or连接条件,否则导致引擎放弃使用索引

4.索引无法存储null值,所以where的判断条件如果对字段进行了null值判断,将导致数据库放弃索引而进行全表查询。

单列索引无法储存null值,组合索引无法全储存为null;查询时,采用is null 条件时,不能利用索引,只能通过全表扫描

为什么索引列不能储存null值:索引是有序的。NULL值进入索引时,无法确定其应该放在哪里。

5.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。

6.in 和 not in 也要慎用,否则会导致全表扫描

7. 应尽量避免在索引列上进行函数操作或者运算,这将导致引擎放弃使用索引而进行全表扫描

8.mysql优化器觉的全表扫描效率高,就会放弃索引。

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

推荐阅读更多精彩内容