加入/排序慢慢运行

时间:2012-09-18 00:43:12

标签: mysql sql join sql-order-by

我花了几个小时来制作一个执行JOIN的SQL查询并将两个列排在一起,这是我之前没有处理过的方式。这是查询:

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_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`)
)

2 个答案:

答案 0 :(得分:2)

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

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`)
)

答案 1 :(得分:1)

你强迫它为每一行运行LEAST(两次!)以对其进行排序。它不能使用索引。