【问题标题】:faster way of executing SELECT ... WHERE id IN ... in mysql在mysql中执行SELECT ... WHERE id IN ...的更快方法
【发布时间】:2012-01-21 02:28:14
【问题描述】:

当我发现我的数据库存在巨大问题时,我正处于一个 uni 项目的中间。使用 wamp 和一个庞大的(300Mb)数据库,但只有几个表,我的查询非常慢:(所有表都是用 MyISAM 引擎创建的。所有设置都是默认设置,我没有任何优化经验。我需要考虑一些更好的方法来做到这一点,但现在我的问题是什么是以下查询的最佳替代品:

SELECT * FROM `payments` WHERE id IN (1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

我不能使用左连接或我在这里找到的任何类似解决方案,因为这些 ID (1,2,3,4,5, ...) 不是来自数据库。用户选择他要删除的付款,然后在下一个屏幕上显示付款详细信息。

仅供参考,支付表有超过一百万条记录 :)

【问题讨论】:

  • id 列上有索引吗?这可能最有帮助(对于这个查询)
  • 300Mb 并不大。即使是在 MSWindows 上运行的应用程序。也许如果您展示了表/索引的结构、mysqld 设置并提供了一个我们可以建议的解释计划。仅仅因为数据来自用户并不意味着它不能进入​​数据库。

标签: mysql select where


【解决方案1】:

对于连续范围:

SELECT * FROM payments WHERE id BETWEEN 1 AND 10

如果范围不相交: 使用其中的值创建一个索引 memory 表。

CREATE TABLE mem_table (
  pk unsigned integer primary key
) ENGINE = MEMORY;

INSERT INTO mem_table (pk) VALUES (1),(2),...,(10);

SELECT p.* FROM payments p
INNER JOIN mem_table m ON (m.pk = p.id);

见:http://dev.mysql.com/doc/refman/5.0/en/memory-storage-engine.html

附言 确保你在id 上有一个索引(这应该是主键)。

【讨论】:

  • 哦,恐怕我对内存表一无所知。我会在接下来的几天里玩它,如果这有效,我会告诉你。非常感谢!
  • 是的,这就够了。而且我现在已经了解了内存表的用途:) 非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-30
  • 1970-01-01
  • 2011-06-02
  • 2017-09-27
  • 1970-01-01
  • 1970-01-01
  • 2020-11-30
相关资源
最近更新 更多