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) for
brand. But it is hardly enough smaller to matter on space or speed. (And if you goof and make
brand_id 的平均约 7 个字节a
BIGINT`,即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 示例一样),那么您 不能 这样的索引,性能会受到影响。
下面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) for
brand. But it is hardly enough smaller to matter on space or speed. (And if you goof and make
brand_id 的平均约 7 个字节a
BIGINT`,即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 示例一样),那么您 不能 这样的索引,性能会受到影响。