mysql + php的性能问题

时间:2016-05-10 12:22:44

标签: php mysql performance

我有以下PHP脚本,它执行MySQL-Query。

$sSql = "SELECT DISTINCT t1.* "
      . "FROM import_data t1 "
      . "INNER JOIN import_profiles imp on t1.profile_id = imp.id "
      . "WHERE imp.creditornr = " . $vendor . " "
      . "AND t1.vendor = '" . $k . "' "
      . "AND t1.importRun = (SELECT MAX(importRun) AS importRun
         FROM import_data
         WHERE sku=t1.sku
           AND profile_id = t1.profile_id)";

在本机SQL中,查询如下所示:

SELECT DISTINCT t1.*
FROM import_data t1
INNER JOIN import_profiles imp on t1.profile_id = imp.id
WHERE imp.creditornr = 73329
AND t1.vendor = 'rackmountit'
AND t1.importRun = (SELECT MAX(importRun) AS importRun
            FROM import_data
            WHERE sku=t1.sku
              AND profile_id = t1.profile_id)

这是其中一个查询的解释:(我运行>其中10个),数据库目前有~100,000个条目(上升)。

Explain

此外,这些是本声明中使用的表格:

import_data Table import_data

import_profiles Table import_profiles

我不知道如何,因为我在mysql中不是那么好,但有没有想法如何提高这些(子)查询的性能?目前他们正在运行> 1:00我需要优化它。

如果您需要更多信息,请与我们联系。

编辑1 添加了CREATE TABLE语句

SET NAMES utf8;
SET time_zone = '+00:00';

CREATE TABLE `import_data` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `profile_id` int(11) NOT NULL,
  `sku` varchar(255) NOT NULL,
  `vendor` varchar(255) NOT NULL,
  `evp` double NOT NULL,
  `ek` double NOT NULL,
  `articletext1` text NOT NULL,
  `articletext2` text NOT NULL,
  `ean` text NOT NULL,
  `stock` int(11) NOT NULL,
  `zolltarif` int(11) NOT NULL,
  `tstamp` date NOT NULL,
  `importRun` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;


CREATE TABLE `import_profiles` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `creditornr` int(6) NOT NULL,
  `structure` text NOT NULL,
  `updatetime` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 COMMENT='Import-Profile für Vorlieferanten';

3 个答案:

答案 0 :(得分:1)

您应该为字段添加索引:import_data.profile_id,import_data.sku和import_profiles.creditornr它应该提高您的SQL查询速度

答案 1 :(得分:0)

这取决于您的架构以及您的数据实际情况。

供应商字段似乎是在其上放置索引的良好候选者。但这取决于它的独特之处。如果供应商列的每一行都是唯一的,那么请查找其他要过滤的内容。

使用购物杂货的类比: 正如我在专栏中所提到的那样,临时就像拥有一个很长的购物清单,将所有或几乎所有整个清单复制到一张新纸上,然后通过副本查找列表中的哪些项目是合适的到你所在的杂货店。

编辑:SO回答如何添加索引,建议阅读评论。 - https://stackoverflow.com/a/3002635/9908

答案 2 :(得分:0)

import_data:  INDEX(sku, profile_id, importRun) -- for the MAX subquery
import_data:  INDEX(vendor)
import_profiles:  INDEX(creditornr, id)

(目前还不清楚最后两个中哪一个有,但包括两者都不会受到伤害。)

由于您的查询有点" groupwise max",请参阅groupwise max