查询运行时间更长。优化建议

时间:2013-12-19 02:08:43

标签: mysql sql query-optimization

表定义和索引如下所示

CREATE TABLE `asin` (
  `ASIN` tinytext,
  `URL` tinytext,
  KEY `ind1` (`ASIN`(20))
) ENGINE=MyISAM DEFAULT 

CREATE TABLE `info` (
  `ASIN` tinytext,
  `Title` tinytext,
  `Description` tinytext,
  KEY `ind1` (`ASIN`(20)),
  KEY `ASIN` (`ASIN`(20))
) ENGINE=MyISAM DEFAULT 

目前第一张表包含15056条记录,第二张表包含19975条记录。

我想找出asin表中的记录,而不是在info表中

SELECT A.ASIN FROM ASIN A 
WHERE NOT EXISTS ( SELECT 1 FROM INFO B WHERE A.ASIN = B.ASIN )

查询耗时145.2200秒

我认为这是一种有效的查询方式,但查询需要更多时间。任何建议。我希望我提供所有细节。

2 个答案:

答案 0 :(得分:1)

  

“我已经尝试过这个选项了,但是没有任何改进比当前时间更长。”

我认为您在ASIN

上使用的是20字节前缀索引

设计考虑因素

  1. TINYTEXT易于VARCHAR(255)。除非您涉及磁盘空间,否则没有理由为INDEX设置20个字节。

    CREATE TABLE `asin` (
      `ASIN` VARCHAR(255),
      `URL` VARCHAR(255),
      KEY `ind1` (`ASIN`)
    ) ENGINE=MyISAM DEFAULT;
    
    CREATE TABLE `info` (
      `ASIN` VARCHAR(255),
      `Title` VARCHAR(255),
      `Description` VARCHAR(255),
      KEY `ind1` (`ASIN`)
    ) ENGINE=MyISAM DEFAULT;
    
  2. asininfo之间的关系。一到一个?一对多?,如果一对一。将两个表合并到一个表中。

    CREATE TABLE `asin` (
      `ASIN` VARCHAR(255),
      `URL` VARCHAR(255),
      `Title` VARCHAR(255),
      `Description` tinytext,
      KEY `ind1` (`ASIN`)
    ) ENGINE=MyISAM DEFAULT;
    
  3. 您需要主键

    • 与MyISAM无关的性能。但拥有PK是一种很好的做法。
  4. 使用InnoDB而不是MyISAM

    • 您可以使用FK。
    • 行级锁定
    • 交易
    • 集群INDEX(仅适用的PK)

答案 1 :(得分:0)

使用反向左连接!

SELECT a.asin
FROM asin AS a
LEFT JOIN info AS b ON a.ASIN=b.ASIN
WHERE b.ASIN IS NULL