假设我想检查MySQL表中是否存在一条记录。我会运行一个查询,检查返回的行数。如果0行执行此操作,则执行该操作。
SELECT * FROM table WHERE id=5
SELECT id FROM table WHERE id=5这两个查询之间有什么区别吗?是将精力花在返回每一列上,还是花在过滤掉我们不关心的列上?
SELECT COUNT(*) FROM table WHERE id=5这是一个全新的问题。服务器是否会抓取所有的值,然后计算这些值(比平时更难),或者它会不会费心抓取任何东西,而只是在每次发现匹配时递增一个变量(比平时更容易)?
我认为我对MySQL的工作原理做了很多错误的假设,但这就是问题的核心!我哪里错了?教育我,Stack Overflow!
发布于 2009-01-28 02:32:59
优化器(通常)是相当聪明的。他们通常只抓取他们需要的东西,所以我会这样说:
SELECT COUNT(1) FROM mytable WHERE id = 5发布于 2009-01-28 03:52:50
最明确的方式是
SELECT WHEN EXISTS (SELECT 1 FROM table WHERE id = 5)然后1否则0结束
如果有一个索引在id上(或以id开头),它将只以最高效率搜索索引中的第一个条目,并使用该值找到。它不会读取记录。
如果您选择COUNT(*) (或COUNT under ),在相同的情况下,它将对索引条目进行计数,但不读取记录。
如果选择*,它将读取所有记录。
发布于 2009-01-28 02:34:53
如果您要做的只是检查记录的存在,则可以通过附加Limit 1将结果限制为最多一行。
SELECT id FROM table WHERE id=5 LIMIT 1这肯定会确保返回或处理的行数不超过一行。根据我的经验,使用LIMIT 1(或者在DB中使用TOP 1)来检查行的存在对于大型表的性能有很大的不同。
编辑:我想我误解了你的问题,但我还是会在这里留下我的答案,如果它有任何帮助的话。
https://stackoverflow.com/questions/486270
复制相似问题