我对Mysql中的搜索有疑问或误解。
在我的表中,我有2个字段,第一个是ID
(第8个),第二个是used
(第1个)。
used
字段只需像布尔值一样得到0或1。
假设行数为20001,
关于ID
:我的上一个ID是20001,第一个ID是1.
关于used
:我的第一行ID = 1是1,其他的是0。
现在,当我想要获得一行时,我会写下这段代码。没关系。
SELECT *
FROM `table`
WHERE `used` =0
LIMIT 0 , 1
我只想要used
中有0行的行。
但我的问题是:我想,Mysql搜索了所有20000行,所以给我一行。这会伤害我,因为我只想要used
中有0行的一行
什么是最好的方式?
答案 0 :(得分:2)
这将返回第一个匹配项,搜索将在找到第一个匹配项时停止。
<强> 1 强>
SELECT TOP 1 *
FROM `table`
WHERE `used`=0
OR NOT (EXISTS (SELECT NULL FROM `table` WHERE `used`=0))
ORDER BY ASCENDING;
<强> 2 强>
SELECT *
FROM `table`
WHERE `used`=0
OR NOT (EXISTS (SELECT NULL FROM `table` WHERE `used`=0))
ORDER BY ASCENDING LIMIT 1;
两者都做同样的事情,运行你的测试,看看哪一个执行得更快。
答案 1 :(得分:1)
SELECT * FROM table_name WHERE used = "0";
将为您提供使用值为0的所有行,其中包含:
SELECT * FROM table_name WHERE used = "0" LIMIT 1;
会给你一行使用的值是0。
如果这不是你想要的,你能澄清你的问题吗?
如果您需要最后一条记录
SELECT * FROM table_name WHERE used = "0" ORDER BY id DESC LIMIT 1;
修改:
如果您担心查询的速度,我怀疑如果您通过命令行(或您喜欢的工具)启动您的mysql并运行提供给只有那么多记录的表的查询,您将得到句子说它有多长如果它绝对没有,它可能会说(0.00秒)。 :)
如果您的表变得更复杂,请考虑学习对某些列使用mysql索引:http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html
关于MySQL中的保留字:
您的表命名引起了我的注意,您应该考虑使用除table
之外的其他内容作为表名,这样您在使用表字时就不需要使用引号。 (你也在词used
周围使用它们,这甚至都不是保留词。
应避免在MySQL(5.5)中使用的保留字列表:http://dev.mysql.com/doc/refman/5.5/en/reserved-words.html