MySQL 关于联合索引的字段顺序规则讨论
Mysql 建立联合索引时,我这边一般是基数小的排在前面,基数大的排在后面。『如果不对,欢迎指正,谢谢大家!』
今天后辈问起联合索引为何是基数小的排在前面?基数大的排在后面?
想了很久,都不知怎么解释。。。
如果是你,你要怎么向后辈解释联合索引的字段顺序规则呢?
Tip: 网上找了很久,也没找到联合索引字段顺序说明的优质文章。。。
基数越小表示非重复数据少,比如性别只有男和女的话,基数就是 2;再比如月份只有 12 个月,那么基数就是 12,所以性别字段的基数比月份字段的基数小。
为啥一定要基数小的在前呢?如果我设置最常用的where搜索频次最高的在前不行么
按LZ的场景,假定所有字段的搜索频次都是无差异的;其实个人觉得和基数是没是没什么关系的,假设LZ用的索引数据结构是B+TREE,那么你用“基数大×基数小”, 对比“基数小×基数大”构建出来的二叉树数据结构的叶子节点数是一样(在二叉树下,甚至连深度都是一样的),既然树的大小、算法复杂度、深度都一样,个人认为查询效率上是不存在有什么区别的。『没有实际尝试过、如果不对,欢迎指正,谢谢大家!』
我的理论告诉我,应该基数大的在前面 例如 id(非重复) 和 性别做联合索引, 我需要查
id=10 and sex = male
那么直接用 id 就能够定位到行; 而反过来建索引,则需先检索全部男生,再找 id = 10 (仅我个人的观点,等明天我建表试试)