MySQL:如何优化这个查询?

标签 mysql query-optimization

我几乎花了一天时间来优化这个查询:

SELECT 
    prod. *, 
    cat.slug category_slug, 
    sup.bname bname, 
    sup.slug bname_slug
FROM bb_admin.bb_directory_products AS prod
LEFT JOIN bb_admin.bb_categories_products AS cat 
    ON prod.primary_category_id = cat.category_id
LEFT JOIN bb_admin.bb_directory_suppliers AS sup 
    ON prod.supplier_id = sup.supplier_id
LEFT JOIN bb_admin.bb_directory_suppliers AS credit_sup 
    ON prod.credit_supplier_id = credit_sup.supplier_id
LEFT JOIN bb_admin.bb_directory_suppliers AS photo_sup 
    ON prod.photo_supplier_id = photo_sup.supplier_id
WHERE (
    prod.status = '1'
    OR prod.status = '3'
    OR prod.status = '5'
)
    AND (
        sup.active_package_id != '1'
        OR sup.active_package_id != '5'
        OR sup.active_package_id != '6'
        OR prod.supplier_id = '0'
    )
    AND (
        sup.supplier_id = '1989'
        OR credit_sup.supplier_id = '1989'
        OR photo_sup.supplier_id = '1989'
    )
GROUP BY prod.product_id
ORDER BY prod.priority_index ASC

你能帮我优化这个查询吗?

最佳答案

  1. 将列数据类型更新为 INT 或其变体之一,因为您要检查的数据类型都是整数 ID(假设)。
  2. 在以下列上创建索引(如果可能的话在所有表中):

    • 产品状态
    • supplier_id
    • active_package_id
  3. 使用 IN 子句而不是连接 OR 段。

我将把更新后的 WHERE 子句放在这里:

WHERE prod.status IN(1, 3, 5)
    AND ( sup.active_package_id NOT IN(1, 5, 6)
        OR prod.supplier_id = 0
    )
    AND 1989 IN (prod.supplier_id, prod.credit_supplier_id, prod.photo_supplier_id)

关于MySQL:如何优化这个查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18754471/

相关文章:

mysql - 将 Mysql 表列更改为区分大小写

php - 将csv文件导入homestead laravel中的mysql表字段

mysql2 : error on reading inital communication packets

php - Mysql where 子句在 codeigniter 中不起作用

php - 在达到大型 MySQL 数据库(例如 100 万行)后,提供 LIMIT 是否有助于优化?

mysql - SQL 查询优化——真的没有什么可以改进的了吗?

mysql - 请教我如何优化这个 MySQL 查询

php - 如何在 PHP 中回显 INNER join

mysql - WHERE 谓词的顺序和 SQL 优化器

mysql - 优化 MySQL 中的前向索引