当前位置: 首页 > 原理解释

mysql 索引基本原理-MySQL 索引核心原理

我的电脑里堆了一堆旧硬盘,还得自己找那根坏掉的线。
有时候修好了,明天还得换个新的散热器。你懂的,老系统更新,数据仿佛都跟着抖。 MySQL 索引那玩意儿,说白了就是给数据库设道“收费站”。
你想找资料,得先过这关,不然转不进去。
要是不设,全库扫一遍,工夫估摸就够你转个圈。人有多智慧,扫路工夫就有多短;数据量大得像大海,扫一遍就得把船全弄沉。加个索引,就是给大船装个锚,要么给船头挂个牌子。
这牌子不是用来挡路的,而是让你拿着牌子排队进站,别让人冲你吼。 有人问,这牌子到底有啥用?你说它能帮你跳个坑。
对,索引就像个地图,要么一个导航仪。你不用在茫茫数据海里瞎转,而是沿着这条路走。
这条路的尽头有个“目标”,就是你要找的一行数据要么一组数据。有了索引,你的电脑就像有了“方向感”,不再盲目地挖地三尺,而是直奔目标地。 想象一下那个场景。有个大仓库,里面堆着成千上万箱货物,每一箱都贴着标签,但仓库管理员记不住哪箱是哪箱。你要是用传统的“笨办法”,每箱都去翻一遍,那得翻到通宵了,要么把整个仓库都拆了再重新编目录。
这时候你手里有个“标签本”,叫做索引。你翻到某箱,打开标签,一看上面写着“货物 A-001"。 货 A-001 就在 B-002 后面,一箱那会儿两箱,再那会儿……直到你数到第 100 箱。 这时候,要是你没有那个“标签本”,那你的脑子就得像短路一样,从 1 数到 100,要么从头到尾扫一遍,最终发现后面那箱是空的。 有了标签本,你只走了两步,直接找到了。 再换个说法。
没有索引的时候,查数据像捞鱼,把水缸翻了个底朝天。有索引的时候,查数据像拔白菜,直接掏出来。
这区别,就像你中午饿,有饭吃没饭吃,饿着饿着就饱了;没饭吃,饿得直不起腰。 有时候你会认定索引挺花哨,像给东西加个华丽的外衣。
实际上不然,它就是个精简的目录。别会被电影里那些复杂的特效骗了。它只是告诉电脑:“嘿,别在无涉紧要的地方浪费工夫了,直接找我们要找的那个。” 说到执行盘算,那才是索引的实话。想象你正在做一道复杂的菜,第一步是洗菜(扫描表),第二步是切肉(过滤),第三步是炖肉。
要是表挺大,第一步简直要花掉你 90 分钟。
这时候你的厨师长会告诉你:“先把大锅底的肉挑出来,只挑那些肉块大、形状规整的,剩下的扔一边,这样你就省了 90 分钟等菜的工夫。”这就是索引的功能。 去执行盘算里找是不是有点反直觉。
你看,那里列出的步骤大量,但最慢的那一步实际上挺短。
这就是索引的功劳,它让那些原本会花大半天、半天大半夜才能做完的沉甸甸步骤,瞬间变成了几秒就连毫秒级的操作。它像是一个魔法,把“大海捞针”变成了“大海捞针”的简化版。 举个例子。你有个表,里面存着几百万个用户 ID。
你想找 ID 为 12345 的那个用户。 没索引的时候,你的数据库得像疯了一样,把每一行都拿出来,逐个比对。
要是用户有 5000 万条记录,比对完了,你得等挺久挺久,要么直到硬盘彻底在那儿开机了。 加了索引(比如按 ID 建了个索引)赶明儿,数据库学会了:“嘿,你想找 12345?那我直接走那条路,把 ID 字段按顺序排好,找到第 12345 行,拿出来!” 这中间别看多了一套代码,但数据库跑得飞快,出于那是它熟悉的“常行”。 不过,索引也不是万能的,也有它的脾气和弱点。 数据量大了,索引就大了,就连大到占掉整个硬盘。
这时候你可能会认定系统变慢了,出于找索引本身也得工夫。 还有,索引是有条件的。
比如你得按“姓名”排序,它就在“姓名”这一列建索引;要是按“金额”排序,那它就在“金额”这列建索引;要是按“工夫”排序,那就在“工夫”列建索引。 要是你恰好按“金额”排序,却只建了“姓名”索引,那查询就会挺痛苦。出于它得先建个索引,再查,那多出来的这层操作,就慢慢挤占了你的工夫。 就像你下午想喝杯咖啡,结局你早上只买了牛奶,下午你人找不着了。 有时候你会问,为啥有时候用索引快,有时候又认定慢了? 大约是出于数据本身不均衡吧。
要是你的数据是均匀分布的,索引就像个完美的导航,走起来顺风顺水。
要是你的数据有时候大量,有时候极少,索引就像个刚做好的跑道,有时候跑得快,有时候出于跑道设计不好,反而差点把路堵死。 还有,数据更新的速度也挺关键。
要是你每秒钟往这个表里刷几亿行数据,那索引就得不停地重建,要么时常断链。
这时候,你查数据的工夫,可能会比建索引的工夫还长。就像你每天要刷几十遍砂纸,最终砂纸都磨秃了,反而比之前新刷一遍磨得好。 另外,空间的事儿也得说说。索引是有体积的。建了一个索引,相当于在那块硬盘上又开辟了一块地。
这块地用来存指针、用来存哈希值。数据量越大,这块地也就越大。 想象一下,你有个大仓库,想放一个大箱子。你为了放那个箱子,在地板上搞个专用的货架。结局难题来了,你正好把那个大箱子放进去,发现这货架比你的大箱子还高出一截,要么你的大箱子根本塞不进去。
这时候你得拆了旧货架,重新建一个更大的,要么干脆扔掉那个货架,重新搭一个更小的。 在数据库里,这就是空间换速度的博弈。 要是数据增长挺快,你犹豫建索引还是不加?我认定省着点建。出于数据量大了,加索引的空间成本就挺高。
要是数据没那么多,那慢慢加,直到你忍不了为止。 还有,索引的维护也是个大工程。
每当你插入、更新要么删除数据时,索引可能要跟着动。
特别是当数据量贼大,要么数据更新频率贼高时,索引可能会变得“乱”起来。
这时候,维护索引的开销会贼大。 比如,你每秒钟往表里插入一条新记录,你的索引就得跟着挪一下。
要是频率忒高,你的数据库就得不停地“加班”,忙着打扫自己的房子,忙着修补自己的门。
这时候,你查数据的工夫,可能会出于忙着打扫而变慢,反而比不上数据少的时候快。 故此啊,别把这当神。索引是个工具,不是救世主。它好在哪儿?好在它好办,好在它能大幅削减不必要的工作,让数据库能更智慧地干活。但它也有坑,坑在空间、坑在更新频率、坑在维护成本。 遇到复杂的数据查询,要么数据量特别大的时候,你最好去查看执行盘算。
看着那条命令,就像看着你的导航仪,看看它是如何走的。 它会不会先挑出那些重复的数据? 它会不会先过滤掉那些明显不需求的字段? 它是否确实利用到了索引? 有时候你会发现,明明用了索引,但执行盘算里依然没有利用到。
那可能是出于数据本身就是那样分布的,要么是出于你的查询条件忒特殊。 这时候,你能够尝试调整一下索引。
比方说,把顺序从“升序”改成“降序”,要么删掉那些没用上的列,只保留最关键的列。 有时候,换个角度思索,把“按 ID 查”变成“按姓名查”,也能省下不少工夫。 毕竟,数据库是冷冰冰的机器,但它需求根据你的需求去努力。索引就像你的助手,助手再好,也得看你想让助手做啥。
要是你不指定方向,助手可能会乱跑,要么跑偏。 故此,在娴熟运用索引之前,先试着去执行盘算里看看,看看数据库是如何思索的。
那些复杂的树,那些指针,那些数字,都是数据库在努力想要给你更快答案的帮衬。 有时候,它可能就是那个最棒的导航员,把原本漫无目标的行走,变成了一条清楚的路。 故此,当你面对海量数据时,别慌,别怕。
只要掌握了索引的原理,学会了如何利用它,就算面对再大的“大数据库”(数据量),你也能像娴熟的操作员一样,找到那行数据,拿到你想要的结局。 毕竟,数据再多,只要方向对了,总能找到答案的。
相关标签:

猜你喜欢

热门阅读

  • 赖柴尔定理-赖柴尔定理
  • 迪拜哪个国家的城市?-迪拜在哪国城市
  • 李毅吧番号及出处-李毅吧番号及出处
  • 贴春联的由来简介50字-春联由来简述
  • 思乡的名言和出处-思乡名言及出处

其他分站