码场趣谈 #1:索引

索引:MySQL 的"GPS 导航"🧭

你是否曾经在千万行数据的海洋中,苦苦搜寻那一条珍贵的记录?没有索引的 MySQL 查询,就像在没有地图的森林里找出口------既累人又低效!

什么是索引?🤔

简单来说,索引就是数据库中的"目录"。想象一下,如果你要在一本 1000 页的字典中找一个单词,你会怎么做?

  • 无索引方式:从第 1 页开始,一页一页地翻,直到找到(全表扫描)😫
  • 有索引方式:直接翻到字典侧边的字母标签,快速定位(索引查询)😎

索引的内部秘密 🔍

复制代码
MySQL:我的索引是B+树结构哦~
其他数据库:装什么酷,不就是棵树嘛!
MySQL:但我的叶子节点是双向链表,你有吗?哼!

B+树索引的优势

  1. 层级浅:通常只有 3-4 层,所以找数据很快!
  2. 顺序访问:叶子节点连成链表,范围查询不费劲!
  3. 高 fan-out:一个节点能存很多索引,更省空间!

常见索引类型 🏷️

索引类型 个性描述
主键索引 数据库的"身份证",唯一且非空,地位最高
唯一索引 有洁癖的索引,相同的值?不存在的!
普通索引 平民索引,没什么特殊要求,好相处
联合索引 团队型选手,多个字段联手出击
全文索引 文学爱好者,专门查找文本内容

索引的尴尬时刻 🙈

并不是所有时候索引都那么给力,有时候它也会"罢工":

  1. 使用了OR且有一侧字段没索引

    sql 复制代码
    -- MySQL:这个查询我选择走全表扫描...
    SELECT * FROM users WHERE indexed_col = 5 OR non_indexed_col = 10;
  2. 在索引列上使用函数

    sql 复制代码
    -- MySQL:你对我的索引列做了什么?!我不认识它了!
    SELECT * FROM users WHERE UPPER(username) = 'ADMIN';
  3. 使用!=<>操作符

    sql 复制代码
    -- MySQL:否定的条件太多了,我还是全表扫描吧...
    SELECT * FROM products WHERE category_id != 3;

索引的维护成本 💰

复制代码
DBA:为什么服务器这么慢?
开发:我给每一列都加了索引,这样查询更快啊!
DBA:*晕倒*

索引不是越多越好!每个索引都需要占用磁盘空间,而且在插入、更新、删除数据时都需要维护索引,会降低写操作的性能。

索引使用小技巧 💡

  1. 经常出现在WHERE子句的列应该加索引
  2. 唯一性强的列更适合做索引
  3. 短索引通常比长索引好(占用空间小,比较次数少)
  4. 联合索引遵循"最左前缀原则"(就像喝奶茶必须先有奶茶,才能加珍珠和椰果)

记住:没有索引的数据库就像没有目录的图书馆,看起来整齐,用起来崩溃!

MySQL:我可以没有漂亮的界面,但绝不能没有高效的索引!


希望这篇文章让你对 MySQL 索引有了更有趣的理解!下次面试官问起,你就可以微微一笑,胸有成竹地回答啦!😉