2013-12-19 31 views
2

表定义和索引都像下面查询运行时间更长。优化建议

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条记录和第2表中包含19975条记录。

我想找出存在的ASIN表中的记录,并在信息表中不存在

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

查询花费145.2200秒

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

+0

本文将帮助http://explainextended.com/2009/09/18/not-in- vs-not-exists-vs-left-join-is-null-mysql/ – Meherzad

回答

0

使用反向左连接!

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

我已经试过这个选项,但没有改进,它比现在的时间多。它采取228.010秒 – user3117500

+0

是的,在改变为Varchar后,运行速度更快。但是在Tinytext中它不能快速执行。 – user3117500

+0

Tinytext不能使用连接索引 - VARCHAR是。这有很大的不同。 –

1

“我已经尝试了该选项,但不提高其比目前的时间采取更多。”

我认为这是你正在使用ASIN

设计考虑

  1. TINYTEXT被evalent到VARCHAR(255) 20字节的前缀指数。除非您涉及磁盘空间,否则没有理由以20个字节为前缀INDEX。

    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。
    • 行级锁
    • 交易
    • 聚集索引(仅适用于PK)
+0

除非你涉及磁盘空间,否则没有任何理由需要20个字节的前缀INDEX。除非你关心的是磁盘空间,否则20个字节前缀INDEX没有理由。而关于你的VARCHAR建议是惊人的。声明表并加载相同的数据后,查询运行在第二部分。谢谢拍卖 – user3117500

+0

@ user3117500我的荣幸;-)最后,为什么不执行Eugen的'LEFT JOIN/IS NULL'查询。我想这比'NOT EXISTS'快一点。我想知道你是否测试了你的和Eugen的并让我知道结果?谢谢。 –

+0

是的,更改为Varchar后更好。我用TINYTEXT声明测试了他的查询。 – user3117500