高性能MySQL-创建高性能索引

1.1 索引基础

简单讲,索引就是书籍后面的“索引”-Index,帮助我们找到特定主题、词语,然后告诉我们具体对应的页码。在MySQL中存储引擎用类似的方法使用索引,先在索引中找到对应的值,然后根据匹配的索引记录找到对应的数据行。

简单例子: select name from actor where actor_id=5; 前提:actor_id 列上建有索引。MySQL 将使用在该列上创建的索引找到 actor_id 为 5 的行,按值在索引上查找,然后返回包含该值(5)的数据行。

像上面的例子,一般可能直接被认为 actor 表以 actor_id 一个列为索引,但正如大多数人做的那样,一个表的索引可能还会包含一个以上的列(多个列)的值。如果是多个列,那么顺序很重要,因为MySQL只能高效利用 最左前缀列。另外,创建一个包含两个列的索引,和创建两个只包含一个列的索引是大不相同的,未来解释。

无论多么复杂的ORM工具,在精妙和复杂的索引面前都是浮云!

索引有很多类型,索引在存储引擎层实现,不在服务器层,因此不同存储引擎、不同索引类型的底层实现都不相同。基本类型包括B-Tree索引、哈希索引、空间数据索引(R-Tree)、全文索引等。

====================B-Tree索引==============

上面的表中,姓(last_name)、名(first_name)、出生日期(dob)为索引(key),图上为这三个列组成的索引的数据组织形式,其中 last_name (姓)是最左前缀,参考链接《最左前缀原则(博文)》

B-Tree索引适用于全值匹配(索引中所有列匹配,Allen、Cuba、1960-01-01)、匹配最左前缀(索引的前缀列,只使用索引第一列,姓 Allen)、匹配列前缀(索引列的前缀,姓列前缀,查 All开头的姓)、匹配范围值(查找 A字母~B字母开头的姓)、精确匹配某一列并范围匹配另外一列(姓列精确匹配=Allen,名称列范围,以K字母开头的名)、只访问索引的查询(不访问数据行,叫“覆盖索引”,未来解释)。

B-Tree以上查找原则,也使用于 ORDER BY 排序字段,能查找就能排序。

B-Tree有些傻乎乎,像人一样固执得狠!不能跳过最左前缀(last_name),只查满足名字和生日的不行;也不能跳过中间列,只查满足姓和生日的不行;如果中间列有范围查询,则居其右边的列优化用不上,例如:WHERE last_name='Smith' AND first_name LIKE 'J%' dob='1976-12-23',dob的优化用不上,因为 first_name 是个范围查询。

由上可以看出 B-Tree索引列的顺序多么多么的重要,在优化时,需要创建相同的多个列但顺序不同的索引,来满足不同的需求,如:key1(last_name, first_name, dob),key1(first_name,last_name,dob),key1(dob,first_name,last_name)

==================== 哈希索引==============

哈希索引,仅用于精确匹配,仅存在于Memory引擎,每行数据都计算一个哈希码(hash code),MySQL接收查询命令后,如:select last_name from People where first_name='Peter' ,先计算 Peter 的哈希值,然后用该哈希值找到记录数据行的指针,通过指针找到数据行,然后判断找到的数据是否为Peter,如果是返回数据。

哈希索引,特点结构紧凑,速度快。

伪哈希索引,因为哈希索引只在 Memory中存在,所以可以参考书中自行在其他引擎中创建伪哈希索引,效果不错,但注意哈希值冲突的解决。

====================空间数据索引(R-Tree)==============

MyISAM支持空间数据索引,可以用作地理数据存储。但MySQL做得不好,很少使用。

==================== 全文索引==============

全文索引,查找的是文本中的关键词,而不是直接比较索引中的值,与其他索引完全不同,不是简单的 WHERE 匹配,而更像搜索引擎做的事情,适用于 MATCH AGAINST 操作。

全文索引,详细见第七章。

===========================================================

1.2 索引优点

索引优点,大大减少了服务器需要扫描的数据量(快速定位);

索引优点,可以帮助服务器避免排序和临时表(顺序存储,便于ORDER BY、GROUP BY);

索引优点,将随机I/O,变为顺序I/O。

索引辩证法,小表,全表扫描更高效;中大表,索引高效;超大表,索引代价高,可以使用分区技术,见第7章。

===========================================================

1.3 高性能索引策略

1)将索引列要独立,放在比较符号的一侧,例如 select * from actor where actor_id + 1 = 5; 应写为 select * from actor where actor_id = 4;

2)前缀索引,一般对BLOB、TEXT、很长的VARCHAR使用,需要保证索引的选择性要高,就是索引的值的数量和记录的总数尽量持平,一般的自增id作为索引基本上选择性=1,不会重复。使用前缀索引要先预估选择性的值,书中有实例。

3)多列索引,在多个列上单独建立索引多数情况下不能提高效率,特别对于AND、OR操作,OR操作更浪费。

4)选择合适的索引列顺序,将选择性最高的列放最左,但只是经验做法。

5) 聚簇索引

6)覆盖索引

7)使用索引扫描来做排序!(很重要!!!)

MySQL通过两种方式生成有序结果:通过排序操作,或,按索引顺序扫描。当 Explain的结果中 type 为 index,就说明MySQL用了索引扫描来做排序了!

扫描索引是很快了的,但如果索引没有能覆盖查询中所需的全部列,那就不得不每扫描一条索引记录就回表查询一次对应的行(自问:为什么?:-))这基本就是随机I/O了,慢,慢!

设计时,一定要注意,如果有一条索引(可能多个列),既能满足查找,又能满足排序,那就好了。

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

推荐阅读更多精彩内容