sql - 使用 IN 运算符优化 MySQL 查询

标签 sql mysql optimization myisam

我有一个 MySQL 数据库,其中有一个相当大的表,其中包含产品。他们每个人都有自己的id和categoryId字段,其中有一个属于该产品的类别id。现在我有一个查询,可以从给定类别中提取产品,例如:

SELECT * FROM products WHERE categoryId IN ( 1, 2, 3, 4, 5, 34, 6, 7, 8, 9, 10, 11, 12 )

当然,可以有 WHERE 子句和 ORDER BY 排序,但不是在这个东西中。假设这些产品有25万,每天的访问量超过10万。在这种情况下,slow_log 表中记录了这些具有较大生成时间的查询的权重。

您对如何优化给定问题有任何想法吗?

表引擎是MyISAM。

最佳答案

在这种情况下,categoryId 上的索引不会有帮助,IN (...) 查询无论如何都会产生序列扫描而不是索引查找。

我会考虑首先重新设计系统以摆脱多个类别选择,如果不合适,则缓存查询结果。

例如,您可以创建一个辅助表 items_category_groups(hash, item_id),并在客户端查询多个类别后散列它们的组合 id 并查找此表。如果没有找到,则进行一次昂贵的查询并填充此表。如果找到,则进行一个连接这些表的廉价查询。其他缓存工具(例如 memcached)也可以使用。

关于sql - 使用 IN 运算符优化 MySQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2408250/

相关文章:

php - 获取特定日期的记录

algorithm - 优化所有子字符串的 trie 结构

php - 从循环php将一行插入mysql

mysql - MySQL 触发器中的常量

mysql - PhpMyAdmin 授予和权限

java - 如何优化此代码以仅显示圆圈数组的轮廓?

mysql - 如何使我的选择查询在 mysql 中更快?

sql - 如何根据列值进行条件连接

sql - Datetime 的哪个 Where 条件会更快?

mysql - 获取库存余额