【问题标题】:Combining Simple, Near-Identical Select Statements组合简单、几乎相同的 Select 语句
【发布时间】:2019-03-29 12:23:29
【问题描述】:

我的 PHP 页面接受的参数之一是用户搜索查询。然后,应用程序接受该查询并执行超过 100 个单独的 SELECT 语句,如下所示:

SELECT * FROM table1 WHERE user = 'query';
SELECT * FROM table2 WHERE user = 'query';
SELECT * FROM table3 WHERE user = 'query';
SELECT * FROM table4 WHERE user = 'query';
...etc...

有没有更快/更有效的方法来做我想做的事情?例如。通过以某种方式将所有选择语句组合成一个语句?我觉得有 100 个单独的查询进入我的数据库会比一个大型查询慢。我不知道如何组合它们,请帮助我。

【问题讨论】:

    标签: php mysql sql select


    【解决方案1】:

    您可以使用Merge Storage Engine 创建一个组合所有这些表的虚拟表,然后查询该表。

    CREATE TABLE table1_100 (
        <column specifications>
    ) ENGINE=MERGE UNION=(table1, table2, table3, ...)
    

    那么你可以写:

    SELECT * FROM table1_100 WHERE user = 'query';
    

    【讨论】:

    • 这是否适用于非常大的表?我的数据库略大于 360GB,大约有 50 亿行。编辑:只需阅读文档并了解到这不适用于具有不同列之类的表。不过谢谢
    • 我们将它用于我们的事务表。我们每年都有一个表格,还有一个合并表格,可以搜索所有这些表格。只需确保表格已正确编入索引。
    • 我假设您的表都具有相同的结构,否则使用 SELECT * 并从中返回所有值实际上没有意义。
    【解决方案2】:

    您可以使用union all 运算符来组合这些查询:

    SELECT * FROM table1 WHERE user = 'query'
    UNION ALL
    SELECT * FROM table2 WHERE user = 'query'
    UNION ALL
    SELECT * FROM table3 WHERE user = 'query'
    -- Etc...
    

    话虽如此,您可能需要重新考虑您的数据库设计。如果你总是一起查询这些表,也许所有数据都应该添加到一个表中。

    【讨论】:

    • 是的..主要问题OP说他有performs &gt;100 separate SELECT statements..更好的设计数据库而不是这样做..
    • 您也可以使用MERGE Storage Engine 使多个表看起来是一个表。
    猜你喜欢
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-07
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    相关资源
    最近更新 更多