mysql - 加入/排序运行缓慢

标签 mysql sql join sql-order-by

我花了几个小时制作一个 SQL 查询,该查询执行 JOIN 并将两列放在一起,以一种我以前从未处理过的方式。这是查询:

SELECT `m`.`id`, `m`.`primary_category_id`, `m`.`primary_category_priority`, `m`.`description`
FROM (`merchant` AS m)
LEFT JOIN `merchant_category`
    ON `merchant_category`.`merchant_id` = `m`.`id`
WHERE
    `merchant_category`.`category_id` = '2'
    OR `m`.`primary_category_id` = '2'
GROUP BY `m`.`id`
ORDER BY
    LEAST(merchant_category.priority = 0, `primary_category_priority` = 0) ASC,
    LEAST(merchant_category.priority, `primary_category_priority` ) ASC
LIMIT 10

它必须对两列一起排序,一列来自merchant_category 表,一列来自merchant 表,以便将它们排序在一起。 merchant 的每一行都有一个“主要”类别(直接在表中引用)和零个或多个“次要”类别,存储在 merchant_category 表中。现在它工作正常,但速度非常慢:在我的生产数据库上通常需要一分钟多一点。我想 JOIN 加上复杂的排序导致了问题,但我能做什么?

编辑以下是两个表的架构:

CREATE TABLE IF NOT EXISTS `merchant` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(100) CHARACTER SET utf8 NOT NULL,
  `primary_category_id` int(11) NOT NULL,
  `primary_category_priority` int(10) unsigned NOT NULL DEFAULT '0',
  `description` mediumtext CHARACTER SET utf8 NOT NULL,
  PRIMARY KEY (`id`)
)

CREATE TABLE IF NOT EXISTS `merchant_category` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `merchant_id` int(10) NOT NULL,
  `category_id` int(10) NOT NULL,
  `priority` int(10) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
)

最佳答案

尝试在第二个表上添加外键约束,

CREATE TABLE IF NOT EXISTS `merchant_category` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `merchant_id` int(10) NOT NULL,
  `category_id` int(10) NOT NULL,
  `priority` int(10) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`),
  CONSTRAINT mc_fk FOREIGN KEY (`merchant_id`) REFERENCES `merchant`(`id`)
)

关于mysql - 加入/排序运行缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12468958/

相关文章:

php - 在docker镜像中安装mysql客户端

mysql - NodeJs - 如何在我的模型之间共享 MySQL 池以避免 'ER_CON_COUNT_ERROR'

php - 从 Hive 表生成 DDL,并将每个 DDL 写入不同的 .txt 文件

SQL:多对多关系,IN条件

MYSQL JOIN TWO TABLES (+ LIMIT based on the first table)

mysql - 加入合并(公式1、公式2、公式3)

php - 获取数百个地址的 lat lng

php - 将数据库放在一台主机上,将 PHP 文件放在另一台主机上

MySQL通过引用一个数据字段来选择多行

sql - 如何修复错误过程需要 '@parameters' 类型的参数 'ntext/nchar/nvarchar' ?