mysql - 考虑到一个条件仅限于几个值,可以有效地进行过滤

标签 mysql sql database

对于字段仅限于几个值的表格,例如下面的类型字段。

例如:表:动物

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/

相关文章:

mysql - 如何将多行插入到一个表中,然后使用自动递增的 ID 插入到另一个表中?数据库

database - Informix 更改 CASE WHEN eventType = 7 THEN "Logged Out"

php - 使用 AJAX/PHP/MySQL 的地址簿 - 1 个文件中的完整项目 :)

java - 如何在不构建字符串的情况下使用 JDBC 进行扩展插入?

MySQL,根据表中的多个其他行选择字段

Mysql 使用 explain 优化慢查询

mysql - 在 SQL 中连接两个不同的表

MySQL - 如何在多级子查询中引用UPDATE子句中的表

mysql - SQL查询字符串按分隔符分割

php - 在 MySql 中连接表来存储已查看的文章 ID