MYSQL 加速查询

标签 mysql performance join

我正在为我学校的午餐订购计划撰写报告,我进行了一个查询,该查询提供了我需要的结果,但速度非常非常慢。我正在考虑使用相关的子查询来加速(来自另一个类似线程的建议)但无法解决语法错误,甚至不确定它是否会完成我想要的。

涉及的两个表是Ordered_Items 和Ordered_Options Ordered Items 表在Ordered Options 表中一般会有3 - 4 条相关记录,代表学生在订购午餐时选择的选项。

一个典型的记录看起来像这样

Ordered_Items.Record_Number = 1
Ordered_Items.Name = Pizza

Ordered_Options.Ordered_Items_rn = 1
Ordered_Options.Value = Jane
Ordered_Options.rn = 43

Ordered_Options.Ordered_Items_rn = 1
Ordered_Options.Value = Doe
Ordered_Options.rn = 44

Ordered_Options.Ordered_Items_rn = 1
Ordered_Options.Value = Pepperoni
Ordered_Options.rn = 45

为了报告目的,我希望它们都显示为一条记录,这样查询的输出将类似于:Pizza Jane Doe Pepperoni。 Ordered_Options.rn 是一致的,这意味着名字总是 = 44 等等。我把我的代码放在下面。

SELECT
  OI.Name AS ItemName,
  opt1.`Value` AS StudentFirst,
  opt2.`Value` AS StudentLast,
  opt3.`Value` AS Grade,
  opt4.`Value` AS Milk
FROM
  ((((
  Ordered_Items OI
  LEFT JOIN Ordered_Options opt1 ON ((
            (OI.record_number = opt1.Ordered_Items_rn)
         AND(opt1.Options_rn = 43))))
  LEFT JOIN Ordered_Options opt2 ON((
            (OI.record_number = opt2.Ordered_Items_rn)
         AND(opt2.Options_rn = 44))))
  LEFT JOIN Ordered_Options opt3 ON ((
            (OI.record_number = opt3.Ordered_Items_rn)
     AND(opt3.Options_rn = 46))))
  LEFT JOIN Ordered_Options opt4 ON ((
            (OI.record_number = opt4.Ordered_Items_rn)
         AND(opt4.Options_rn = 55))))

最佳答案

首先,正如其他人所说,如果您有可能应该真正修改数据库的结构,那么您现在拥有的东西没有多大意义。

但是我一直处于“必须从现有代码生成报告”的情况,所以我知道您可能根本无法做到这一点;如果这确实是您的情况,那么以下查询应该可以帮助您显着提高速度:

SELECT 
  `Record_Number`, 
  Concat(Name, ' ', Group_Concat(Value ORDER BY rn ASC SEPARATOR ' ')) AS Request
FROM 
  `Ordered_Items` oi 
  LEFT OUTER JOIN `Ordered_Options` oo ON (oo.Ordered_Items_rn = oi.Record_Number) 
GROUP BY 
  oi.Record_Number

哪个应该给你这样的东西:

Record_Number   Request
1               Pizza Jane Doe Pepperoni
2               Fries Bobby Table French

由于您是新来的,请记住通过单击左侧的箭头来接受解决方案,这可以解决您的问题。如果没有,请在对此答案的评论中说明原因。

我使用的示例数据库:

--
-- Table structure for table `Ordered_Items`
--    
CREATE TABLE IF NOT EXISTS `Ordered_Items` (
  `Record_Number` int(11) NOT NULL,
  `Name` text NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

--
-- Dumping data for table `Ordered_Items`
--

INSERT INTO `Ordered_Items` (`Record_Number`, `Name`) VALUES
(1, 'Pizza'),
(2, 'Fries');

-- --------------------------------------------------------

--
-- Table structure for table `Ordered_Options`
--

CREATE TABLE IF NOT EXISTS `Ordered_Options` (
  `Ordered_Items_rn` int(11) NOT NULL,
  `Value` text NOT NULL,
  `rn` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

--
-- Dumping data for table `Ordered_Options`
--

INSERT INTO `Ordered_Options` (`Ordered_Items_rn`, `Value`, `rn`) VALUES
(1, 'Jane', 43),
(1, 'Doe', 44),
(1, 'Pepperoni', 45),
(2, 'Bobby', 43),
(2, 'Table', 44),
(2, 'French', 45);

关于MYSQL 加速查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7340924/

相关文章:

php - 用于存储数百万张图像的文件夹结构?

php - Laravel 5 Eloquent : How to get raw sql that is being executed?(绑定(bind)数据)

c# - ASP.NET C# 页面大小是否重要

字典的 Python 列表理解示例

sql - 从旧样式到新样式的加入

php - 使用 JOIN 时将 MySQL 值转换为 PHP 变量

mysql - 数据库搜索并按相关性显示结果

java - 使用专门类型进行 Scala 优化 : sum with longs

mysql - 如果未找到匹配项,则返回某个值的 where 条件

sql - 从join myself中选择第一行