ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
我们需要看那些列上拥有不同的值,那些列在where子句中出现的最频繁.在有更多不同值的列上创建索引的选择性更好 country列的选择性通常不高,但是可能很多查询都会用到.sex列的选择性肯定很低,但也会在很多查询中用到.所以考虑到使用的频率,还是建议在创建不同组合索引的时候将(sex,country)列作为前缀 但是不是说,不应该在选择性低的列上创建索引吗? 这么做有2个理由:第一点:如之前描述的,几乎所有查询都会用到sex列.甚至把网站设计上每次只能按照某一种性别搜索用户.更重要一点,索引中加上这一列也没有什么坏处,即使没有用到sex,也可以绕过去 方法就是,如果这个查询不限制性别,那么可以通过在查询条件中新增AND sex in ('m','f')来让mysql选择该索引.这样写不会过滤任何行,和没有这个条件时返回的结果相同.但是必须加上这个列的条件,mysql才能够匹配索引的最左前缀.这个诀窍在这类场景下非常有效,但如果列有太多不同的值,就会让IN()列表太长,这样做就不行了 我们总是尽可能的把mysql使用更多的列,因为查询只能使用索引的最左前缀,直到遇到第一个范围条件列.前面提到的where都是等于条件,但是age列多半是范围查询 也可以用IN()来代替范围查询,例如年龄条件改写为IN(18,19,20,21),但不是所有范围都可以转换.这里描述的基本原则是,尽可能将需要做范围查询的列放到索引的后面,以便优化器能使用尽可能多的索引列 ![](https://box.kancloud.cn/b61dfcfdf7d1e38564743f0a61bc2778_776x294.png)