对于字段仅限于几个值的表格,例如下面的类型
字段。
例如:表:动物
Name = "Wuf wuf"
Type = "Dog"
/*More properties*/
Name = "Doge"
Type = "Dog"
/*More properties*/
Name = "Meow"
Type = "Cat"
/*More properties*/
首先按此标准进行过滤的最有效策略是什么,而不是分成多个不同的表(Cats、Dogs)。
澄清一下:我会这样做
SELECT * FROM 'Animal' WHERE Type = 'Dog' AND Name = "Wuf Wuf";
据我了解,与
相比,这并不有效SELECT * FROM 'Dogs' WHERE Name = "Wuf Wuf";
即使“类型”已编入索引。
在所有情况下,当我想从此表中选择某些内容时,我都会先知道并按“类型”进行过滤
MySQL 中通常如何处理这个问题?在类型字段上建立索引是否足够?由于“类型”字段仅限于很少的值,是否有更好的方法来构造它?
最佳答案
Instead of breaking into multiple different tables (Cats,Dogs), what would be the most efficient strategy to filter by this criteria first.
我不知道按“此类别优先”过滤是什么意思。如果您关心的是性能,那么将这样的表分成单独的表几乎肯定不是正确的方法。
如果 name
被声明为唯一,那么这些条件可能会具有完全相同的性能:
WHERE Type = 'Dog' AND Name = 'Wuf Wuf'
WHERE Name = 'Wuf Wuf'
为什么?因为 MySQL 优化器足够聪明,可以在这两种情况下使用 name
上的索引。附加条件没有影响。
一般来说,单独针对type
建立索引会很有帮助。也就是说,只有少数值的单个列上的常规索引通常没有用。 “低基数值索引没有帮助”有两个异常(exception):
- 聚集索引会很方便。
- 如果其中一个值很少见并且在查询中也常用,那么这样的索引会很有帮助。
如果您对 Name
进行查询,并且 Type
的一些值且名称不唯一,则可能会出现以下情况仍然使用 Name
上的索引:
WHERE Type = 'Dog' AND Name = 'Wuf Wuf'
不过,一般来说,您应该根据查询所需的条件编写 WHERE
子句。使用索引来获得您想要的性能。
关于mysql - 考虑到一个条件仅限于几个值,可以有效地进行过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58973479/