2012-08-25 43 views
2

我的确有一个问题,或者对Mysql中的seraching有误解。在mysql结果中搜索


以我表我有2个字段,第一个是ID(INT 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行,并给我一行。这会伤害我,因为我只想要一行0数额在used 做什么是最好的方式?

+2

我不认为这个查询会遍历所有20000行。最有可能的是,它会一行一行地检查条件,当限制完成时它会停止。当您将对未编制索引的列进行排序时,问题可能会出现。 – Zefiryn

+0

请更清晰你的问题 –

+1

@Zefiryn你确定吗? –

回答

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

+1

谢谢,但我的问题关于性能。 我想要一行,这是获得一行的最佳SQL代码? –

+1

@wandad是的,您的表格非常简单,无需索引您的列。 –

+0

谢谢我的朋友。 –

2

这将返回第一个匹配项,并且搜索将在找到第一个匹配项时停止。

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; 

都做同样的事情,运行测试,看看哪一个执行得更快。

+0

如果您将“限制”设置为“1”,它将在第一场比赛后停止搜索。 @wandad –

+0

我试过了你的代码,但查询时间是0.0006秒,这意味着你的代码和我的代码是一样的。 你同意吗? –

+0

@ wandad侧注:如果您的查询只需要约0.0006秒,那几乎没有任何结果。 –