Mysql 查询运行的时间更长。优化建议
表定义和索引如下所示Mysql 查询运行的时间更长。优化建议,mysql,sql,query-optimization,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` (
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秒
我认为这是一种有效的查询方式,但查询需要更多的时间。任何建议。我希望提供所有详细信息。使用反向左连接
SELECT a.asin
FROM asin AS a
LEFT JOIN info AS b ON a.ASIN=b.ASIN
WHERE b.ASIN IS NULL
“我已经尝试过这个选项,但没有比当前时间更多的改进。” 我想这就是你在
ASIN
设计考虑
TINYTEXT
被赋值为VARCHAR(255)
。除非涉及磁盘空间,否则没有理由使用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;
- 与MyISAM无关的性能。但拥有PK是一种很好的做法
- 您可以使用FK
- 行级锁
- 交易
- 聚集索引(仅适用于PK)
我已经尝试过这个选择,但是没有比现在更多的改进。需要228.010秒是的,在更改为Varchar后,运行速度更快。但是在Tinytext中,它的执行速度不快。Tinytext无法使用连接索引-VARCHAR是。这将产生巨大的差异。本文将帮助您,除非您考虑到磁盘空间,否则没有理由使用20字节前缀索引。除非您考虑到磁盘空间,否则没有理由使用20字节前缀索引。关于你的VARCHAR建议真是太棒了。声明表并加载相同的数据后,查询以几分之一秒的时间运行。谢谢Lot@user3117500不客气;-)最后,为什么不执行Eugen的
LEFT-JOIN/IS-NULL
查询呢。我想这比不存在的代码要快一点。我想知道你是否同时测试了你的和尤金的,并告诉我结果?谢谢。是的,换成Varchar后更好。我用TINYTEXT声明测试了他的查询。