首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >检查表中是否存在行的最有效方法是什么?

检查表中是否存在行的最有效方法是什么?
EN

Stack Overflow用户
提问于 2009-01-28 02:27:27
回答 6查看 2.7K关注 0票数 5

假设我想检查MySQL表中是否存在一条记录。我会运行一个查询,检查返回的行数。如果0行执行此操作,则执行该操作。

代码语言:javascript
复制
SELECT * FROM table WHERE id=5
SELECT id FROM table WHERE id=5

这两个查询之间有什么区别吗?是将精力花在返回每一列上,还是花在过滤掉我们不关心的列上?

代码语言:javascript
复制
SELECT COUNT(*) FROM table WHERE id=5

这是一个全新的问题。服务器是否会抓取所有的值,然后计算这些值(比平时更难),或者它会不会费心抓取任何东西,而只是在每次发现匹配时递增一个变量(比平时更容易)?

我认为我对MySQL的工作原理做了很多错误的假设,但这就是问题的核心!我哪里错了?教育我,Stack Overflow!

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-01-28 02:32:59

优化器(通常)是相当聪明的。他们通常只抓取他们需要的东西,所以我会这样说:

代码语言:javascript
复制
SELECT COUNT(1) FROM mytable WHERE id = 5
票数 8
EN

Stack Overflow用户

发布于 2009-01-28 03:52:50

最明确的方式是

SELECT WHEN EXISTS (SELECT 1 FROM table WHERE id = 5)然后1否则0结束

如果有一个索引在id上(或以id开头),它将只以最高效率搜索索引中的第一个条目,并使用该值找到。它不会读取记录。

如果您选择COUNT(*) (或COUNT under ),在相同的情况下,它将对索引条目进行计数,但不读取记录。

如果选择*,它将读取所有记录。

票数 4
EN

Stack Overflow用户

发布于 2009-01-28 02:34:53

如果您要做的只是检查记录的存在,则可以通过附加Limit 1将结果限制为最多一行。

代码语言:javascript
复制
SELECT id FROM table WHERE id=5 LIMIT 1

这肯定会确保返回或处理的行数不超过一行。根据我的经验,使用LIMIT 1(或者在DB中使用TOP 1)来检查行的存在对于大型表的性能有很大的不同。

编辑:我想我误解了你的问题,但我还是会在这里留下我的答案,如果它有任何帮助的话。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/486270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档