MySQL 使用引用表的查询性能

MySQL query performance with reference tables

下面2个表结构,假设数据量很大:

cars table
Id | brand name | make year | purchase year | owner name

以这种方式构建并连接 2 个表是否有任何查询性能优势?

cars table
Id | brand_id | make year | purchase year | owner name

brands table
Id | name

此外,如果所有 4 列都在我的 where 子句中,索引任何内容是否有意义?

我至少会 INDEX(owner_name) 因为那是非常有选择性的。 INDEX(owner_name, model_year) 对这种类型的数据 没有足够的帮助。在其他情况下,我会推荐 4 列复合索引。

"data volume is really high"。如果你说有 100K 行,那没关系。如果您说的是十亿行,那么我们需要了解更多细节。

"data volume is really high"。 10 queries/second -- 哈欠。 1000/秒 -- 请提供更多详细信息。

2 tables 对 1.

  • 数据完整性 - 任何人都可能弄乱数据
  • 速度 -- 1 字节 TINYINT UNSIGNED(范围 0..255)小于 VARCHAR(55) forbrand. But it is hardly enough smaller to matter on space or speed. (And if you goof and makebrand_id 的平均约 7 个字节aBIGINT`,即8个字节;好吧,哎呀!)

索引所有列与没有索引不同。但是 "indexing all" 是模棱两可的:

  • INDEX(user), INDEX(brand), INDEX(year), ... 可能会提高按这些列中的任何列进行搜索或排序的效率。
  • INDEX(user, brand, year), ... 使得按所有这些列(使用 =)或某些 ORDER BYs.
  • 进行搜索特别有效
  • 没有索引意味着扫描整个 table 以获得 any SELECT.

对您所说内容的另一种解释(加上一些字里行间的解读):您可能正在按任意列组合进行搜索吗?也许非 = 之类的 year >= 2016?或者 make IN ('Toyota', 'Nissan')?

学习http://mysql.rjweb.org/doc.php/index_cookbook_mysql

1的参数table

如果你需要做

WHERE brand = 'Toyota'
  AND year  = 2017

然后 INDEX(brand, year)(以任一顺序)是可能的并且有益的。

但是...如果这两列在不同的 table 中(与您的 2-table 示例一样),那么您 不能 这样的索引,性能会受到影响。