【问题标题】:MySQL SELECT NOT IN from 30K rows fastMySQL SELECT NOT IN 从 30K 行快速
【发布时间】:2017-09-06 10:41:11
【问题描述】:

我的db表name_info具有30k行和术语表60k行,当不在表中选择时,服务器CPU上升。

我怎样才能最好地编写一个快速选择 1 行的查询?

SELECT slug FROM terms WHERE slug LIKE 'nm%' AND slug NOT IN 
(SELECT imdb_id FROM name_info) LIMIT 1

【问题讨论】:

  • slug和immdb_id是什么数据类型?
  • 字符串/varchar 类似 nm1084488
  • 尝试通过对 name.info.imdb_id 和 terms.slug 的外部连接将术语连接到 name_info。连接可能会比子选择执行得更好。
  • 听@LornaMitchell。 MySQL 执行连接的速度比 NOT IN 子查询构造快。
  • 谢谢,@sloan-thrasher 代码完美运行,正是您的解决方案。

标签: mysql sql select cpu-usage


【解决方案1】:

尝试使用不存在

SELECT slug FROM terms WHERE slug LIKE 'nm%' AND not exists
(SELECT 1 FROM name_info where imdb_id = slug) LIMIT 1

【讨论】:

  • 感谢@Vecchiasignora,但行为类似于我的 sql 代码
【解决方案2】:

确保查询中使用的列已编入索引。

SELECT `slug`
FROM `terms` 
LEFT JOIN `name_info`
ON `slug` = `imdb_id`
WHERE slug LIKE 'nm%' 
AND `imdb_id` IS NULL
LIMIT 0,1;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-06
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    • 2022-11-12
    • 1970-01-01
    相关资源
    最近更新 更多