使用参考表的mysql查询性能

p5cysglq  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(420)

对于以下两个表结构,假设数据量非常大:

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子句中,那么索引任何列有意义吗?

3okqufwl

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的参数
如果你需要的话

WHERE brand = 'Toyota'
  AND year  = 2017

那么 INDEX(brand, year) (以任何顺序)是可能的和有益的。
但是。。。如果这两列在不同的表中(如2表示例),那么就不能有这样的索引,性能将受到影响。

相关问题