如何为多条件查询的数据库表添加Index?求通俗讲解
给10岁孩子讲明白数据库索引怎么加
把你的数据库表想象成一本几百页的漫画书,每一页对应一条用户数据。索引就像这本书的目录——没目录的话,找特定内容得一页一页翻,慢得离谱;有了目录,直接翻到对应页码,快得飞起。
第一步:先抓「最常用来找东西的条件」
你说几乎所有字段都用来查,但肯定有一些查询是每天跑几十上百次的,另一些可能一周才用一次。先盯着那些高频查询下手:
- 如果大家天天查「foo2=true且age>10」的用户,那给这俩字段做个组合目录(组合索引)。注意:把「精确匹配」的字段放前面——比如foo2是要么true要么false(就像找所有带奥特曼的漫画),age是范围(10岁以上),所以组合索引要写成
(foo2, age),就像目录先分「有奥特曼/没奥特曼」,再在有奥特曼的部分里找「主角年龄>10」的页码。 - 如果经常查「related_user是空的」或者「banned=false」,这俩是OR的关系,就给related_user和banned各做一个单独的索引——就像分别做「没有配角的漫画」和「没被禁的漫画」两个小目录,找的时候可以同时查两个目录再合并结果。
第二步:别乱加索引!
你要是给每个字段都做目录,这本漫画书的目录会比内容还厚,而且每次你加新漫画(插入数据)、改漫画内容(更新数据),都得改一堆目录,反而变慢了。就像你不会给每一页都做目录一样,只给真的常用的查询条件加索引。
怎么判断索引真的有用?
用数据库的EXPLAIN命令(就像问图书馆管理员「你是用目录找的吗?」)。把你的查询前面加上EXPLAIN跑一遍,看结果里有没有用到你加的索引:
- 如果看到「Using index」或者索引名字出现在key列里,说明管理员真的用了你的目录,索引有用;
- 如果看到「Using full table scan」(全表扫描),那这个索引白加了,要么是查询条件不对,要么是这个索引根本没必要。
针对你的表的具体建议
- 先统计一周内所有查询的频次,把Top3的高频查询找出来,优先给这些做索引;
- 对于「foo2=true且age>10」这种精确+范围的组合,做
(foo2, age)索引; - 对于「related_user IS NULL OR banned=false」,给related_user和banned各加单独索引;
- 如果经常按created_on排序查最新数据,给created_on加单独索引。
内容的提问来源于stack exchange,提问作者Bob Marley
相关产品推荐
相关产品推荐

