对于以下两个表结构,假设数据量非常大:
cars table
Id | brand name | make year | purchase year | owner name
以这种方式构造并连接两个表是否有任何查询性能优势?
cars table
Id | brand_id | make year | purchase year | owner name
brands table
Id | name
另外,如果所有4列都在where子句中,那么索引任何列有意义吗?
对于以下两个表结构,假设数据量非常大:
cars table
Id | brand name | make year | purchase year | owner name
以这种方式构造并连接两个表是否有任何查询性能优势?
cars table
Id | brand_id | make year | purchase year | owner name
brands table
Id | name
另外,如果所有4列都在where子句中,那么索引任何列有意义吗?
1条答案
按热度按时间3okqufwl1#
我至少会
INDEX(owner_name)
因为这是非常有选择性的。有INDEX(owner_name, model_year)
对于这种类型的数据来说帮助不大。在其他情况下,我建议使用4列综合指数。“数据量真的很高”。如果你说有10万行,那就没什么关系了。如果你说的是10亿行,那么我们需要进入更多的细节。
“数据量真的很高”。10个查询/秒——打哈欠。1000/秒--请提供更多详细信息。
2张table对1张table。
数据完整性-无论哪种方式,都可能有人弄乱数据
速度—1字节
TINYINT UNSIGNED
(范围0..255)小于VARCHAR(55) for
品牌. But it is hardly enough smaller to matter on space or speed. (And if you goof and make
品牌识别码a
bigint,即8字节;哦,哎呀!) 索引所有列与没有索引不同。但是“索引全部”是不明确的:
INDEX(user), INDEX(brand), INDEX(year), ...很可能使按这些列中的任何一列进行搜索或排序变得高效。
INDEX(user, brand, year), ...通过所有这些列进行搜索(使用
=),或确定
ORDER BYs. 没有索引意味着要扫描整个表中的
SELECT. 对你所说的另一种解释(加上字里行间的一点阅读):你可能是在通过任何列的组合进行搜索吗?也许不是-
=比如
year >= 2016? 或者
make IN ('Toyota', 'Nissan')` ?学习http://mysql.rjweb.org/doc.php/index_cookbook_mysql
表1的参数
如果你需要的话
那么
INDEX(brand, year)
(以任何顺序)是可能的和有益的。但是。。。如果这两列在不同的表中(如2表示例),那么就不能有这样的索引,性能将受到影响。