表定义和索引如下所示
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秒
我认为这是一种有效的查询方式,但查询需要更多时间。任何建议。我希望我提供所有细节。
答案 0 :(得分:1)
“我已经尝试过这个选项了,但是没有任何改进比当前时间更长。”
我认为您在ASIN
设计考虑因素
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;
asin
和info
之间的关系。一到一个?一对多?,如果一对一。将两个表合并到一个表中。
CREATE TABLE `asin` (
`ASIN` VARCHAR(255),
`URL` VARCHAR(255),
`Title` VARCHAR(255),
`Description` tinytext,
KEY `ind1` (`ASIN`)
) ENGINE=MyISAM DEFAULT;
您需要主键
使用InnoDB而不是MyISAM
答案 1 :(得分:0)
使用反向左连接!
SELECT a.asin
FROM asin AS a
LEFT JOIN info AS b ON a.ASIN=b.ASIN
WHERE b.ASIN IS NULL