扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
Schema的优化和索引 - 学习一个索引示例2
技巧就是:即使一个查询没有对sex进行一些约束,我们也能通过AND sex IN('m', 'f')保证索引的使用。这么做不会过滤任意的行。因此功能上来说和不包含sex查询的语句一样。然而,我们需要包含这一列,因为这样做会使MySQL使用一个更大前缀的索引。这个技巧比较适用于这个需求,但是如果这个值有太多的不同,这样做就不会工作的很好,因为IN()列表太大了些。
这个例子揭示出一个一般准则:全面的考虑整张表。当你设计索引,不要仅仅思考你现有语句所需的索引类型,还要考虑优化语句。如果你需要一个索引,但是你想到一些语句可能会受到不好的影响,问问自己是否能改变这些语句。你应该把语句和索引一起优化来找到折中的一个方案;你没必要设计一个完美的索引schema.
接下来我们要考虑的是其他WHERE条件的组合并且考虑没有索引的情况下哪些组合会变慢。(sex,country,age)上索引是个显而易见的选择,并且我们也需要在(sex,country,region,age)和(sex,country,region,city,age)上创建索引。
这样会有很多索引的。如果我们想重用索引并且不生成过多的索引组合。我们可以使用IN()的技巧并且废弃(sex,country,age)和(sex,country,region,age)索引。如果它们并没有在搜索表单中,可以指定所有国家的列表或者国家的所有区域来确保符合和索引前缀相等的约束。
这些索引可以满足大部分常用查询的需要,但是我们怎样设计其他一些不常用的搜索条件呢。比如has_pictures, eye_color, hair_color和education?如果这些列选择性低并且不经常使用,我们可以不给它们创建索引并且让MySQL扫描一些额外的行。我们也可以这样做,我们可以把它们添加到age之前并且用到我们之前用到的IN()的方法。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者