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是一种很好的做法
  • 使用InnoDB而不是MyISAM

    • 您可以使用FK
    • 行级锁
    • 交易
    • 聚集索引(仅适用于PK)

  • 我已经尝试过这个选择,但是没有比现在更多的改进。需要228.010秒是的,在更改为Varchar后,运行速度更快。但是在Tinytext中,它的执行速度不快。Tinytext无法使用连接索引-VARCHAR是。这将产生巨大的差异。本文将帮助您,除非您考虑到磁盘空间,否则没有理由使用20字节前缀索引。除非您考虑到磁盘空间,否则没有理由使用20字节前缀索引。关于你的VARCHAR建议真是太棒了。声明表并加载相同的数据后,查询以几分之一秒的时间运行。谢谢Lot@user3117500不客气;-)最后,为什么不执行Eugen的
    LEFT-JOIN/IS-NULL
    查询呢。我想这比不存在的代码要快一点。我想知道你是否同时测试了你的和尤金的,并告诉我结果?谢谢。是的,换成Varchar后更好。我用TINYTEXT声明测试了他的查询。