mysql - MySQL WHERE 参数顺序是否重要?
问题描述
假设我有一个包含 125 万只猫的数据库。
10%的猫是雄性,90%是雌性。
1% 的猫叫鲍勃。
30% 的猫喜欢蓝色。
如果我查询说
select * from cats where gender="male" and name="Bob" and favorite_color="blue";
where 语句的顺序对性能有什么影响吗?
在这种情况下,这 3 个参数都在同一张表上,但理论上您可以先按性别搜索以排除 90% 的可能结果。拆分成多个查询会有帮助吗?除了删除通配符 * 之外,优化此搜索的最佳方法是什么?谢谢!
解决方案
where 语句的顺序对性能有什么影响吗?
不,它没有。
MySQL 的查询计划器(就像几乎所有 SQL 查询计划器一样)寻找满足每个查询的最有效方法。它考虑了各种方法并选择了一种有效的方法。通常它会查看表上的索引。你有三个 where 标准提到平等。因此,三列上的复合索引(name, gender, favorite_color)
将显着加快查询速度。
对于大多数程序员来说,SQL 有一些违反直觉的东西。它是声明性的。也就是说,你告诉它你想要什么,而不是如何得到它。由查询计划者决定如何获取它。
这真是一件好事。为什么?数据库表在生产中的寿命很长(有时是几十年)。随着它们的增长,以及访问它们的软件的变化,从它们那里得到你想要的东西的最佳方式也会发生变化。您不必担心这些更改,除非根据需要添加索引。
请考虑阅读以下内容: https ://use-the-index-luke.com/
推荐阅读
- php - PHP datediff 过日问题
- elasticsearch - 未根据 ES 查询中传递的大小参数进行聚合
- javascript - 没有窗口的窗口属性
- matlab - 如果语句中的 X=0 的值未在 matlab 图中绘制
- azure - Azure ARM 部署 - 多个订阅
- android - Android Studio 中的多个根标签错误(清单 - 问题
) - angular - CKEditor 5 - Angular 7:对象 ngModel 绑定子子问题
- python - 将单个dict数组写入csv文件该键,值变为一行
- acumatica - 从 REST API 获取组合框值集
- reactjs - 在 Gatsby App 中映射 Prismic Slice 数据