【问题标题】:Optimise multiple OR query优化多个 OR 查询
【发布时间】:2011-06-12 01:59:22
【问题描述】:

我有一个数据库表,我需要验证用户是否输入了相同或部分相同的信息。

这就是我的想法

数据库布局

rec_id (pk), user_id,
name, phone, address_1, address_2, zip, 
company, co_phone, co_address_1, co_address_2, co_zip, 
billing, bi_phone, bi_address_1, bi_address_2, bi_zip

查询

SELECT rec_id 
FROM tbl_name
WHERE user_id = '123456789'
OR '1112223333' IN (phone, co_phone, bi_phone)
OR 'John Doe' IN (name, business, billing)
OR '12345' IN (zip, co_zip, bi_zip)
OR '123 main street' IN (address_1, co_address_1, bi_address_1)
OR 'po box 123' IN (address_2, co_address_2, bi_address_2)

如果任何数据匹配(是的,这将是误报)我需要旧的 rec_id。

想知道是否有更好的方法来做到这一点?

谢谢

【问题讨论】:

    标签: postgresql sqlperformance sql-optimization


    【解决方案1】:

    为了使这个查询能够很好地执行,您需要为您正在测试的每个列设置单独的索引。所有列上的组合索引对于 OR 条件根本没有帮助(如果你有 AND,它会有所帮助)。

    但是,我认为无论您添加哪些索引,您的查询都会导致全表扫描。您可能想尝试使用 UNIONs 而不是 OR 来看看是否会有所不同:

    SELECT rec_id FROM tbl_name WHERE tax_id = '123456789'
    UNION
    SELECT rec_id FROM tbl_name WHERE phone = '1112223333'
    UNION
    SELECT rec_id FROM tbl_name WHERE co_phone = '1112223333'
    UNION
    SELECT rec_id FROM tbl_name WHERE bi_phone = '1112223333'
    UNION
    SELECT rec_id FROM tbl_name WHERE name = 'John Doe'
    UNION
    SELECT rec_id FROM tbl_name WHERE business = 'John Doe'
    UNION
    SELECT rec_id FROM tbl_name WHERE billing = 'John Doe'
    UNION
    -- etc...
    

    这样重写的想法是,现在每个子查询都可以使用索引(当然假设您已经添加了必要的索引)。

    【讨论】:

    • 嗯,很有意思,可能要试试这个。
    • @Phill Pafford:UNION ALL 比 UNION 快,因为它不会删除重复项,但我想您确实想在这里删除重复项。
    • 谢谢,但重复不是问题,而是加快速度。如果我找到一两条记录没关系,重要的是有/是重复帐户。感谢您的提示
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-06
    • 2022-01-23
    • 2021-06-08
    相关资源
    最近更新 更多