1。因此,如果我在ball
表格中搜索toys
条目5.000.000
,那么我会搜索所有5百万条?
我认为答案是肯定的,因为它应该如何知道,但请告诉我。
2。如果yes
:如果我需要来自该表的更多信息,那么只查询一次并使用结果的逻辑不是更多吗?
示例
我有这个表结构,例如:
id
| toy_name
| state
现在我应该像这样查询
mysql_query("SELECT * FROM toys WHERE STATE = 1");
但查询所有表格并不合逻辑
mysql_query("SELECT * FROM toys");
然后执行此操作if($query['state'] == 1)
?
3。还有别的,如果我在ORDER BY id LIMIT 5
中添加mysql_query
,它会搜索500万个条目还是只搜索最后5个条目?
感谢您的回答。
答案 0 :(得分:3)
是的,除非您有LIMIT
子句,否则它将查看所有行。它将执行表扫描,除非它可以使用index。
您应该在此处使用带WHERE
子句的查询,而不是在PHP中过滤结果。您的RDBMS旨在能够有效地执行此类操作。只有当你需要对数据进行复杂的处理时才更适合将结果集加载到PHP中并在那里进行。
使用LIMIT 5
,RDBMS将查看表格,直到找到您的五行为止,然后它将停止查找。所以,我可以肯定地说,它会看到500到500万行!
答案 1 :(得分:2)
阅读关于索引的内容: - )
http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html
它让它变得非常快: - )
只有在没有匹配的索引且操作非常慢的情况下,才会在此处进行全表扫描。 索引也加快了排序。
对于#2 - 这很慢,因为来自MySQL的传输速率 - > PHP很慢,MySQL在进行过滤方面要快得多。
答案 2 :(得分:1)
对于你的第一个问题:取决于你如何搜索'球'。如果您要搜索的列上没有索引,则必须读取整个表。如果有索引,那么......
WHERE field LIKE 'ball%'
将使用索引WHERE field LIKE '%ball%'
将不使用索引对于您的#2,请按照以下方式考虑:执行SELECT * FROM table
然后在您的应用程序中仔细阅读结果与去当地的超级沃尔玛完全相同,将商店的完整库存加载到您的车中,驾驶它回家,挑选每个盒子/包装,然后 扔出 除了前面的冲动购买架子上的口香糖之外的所有东西,直到你想要的第一个地点。数据库的重点是通过您能想到的任何类型的子句轻松搜索数据和过滤。通过将所有内容整合到您的应用程序并在那里进行过滤,您已经将这个闪亮的数据库简化为非常昂贵的磁盘接口,并且最好将内容存储在平面文件中。这就是WHERE条款的原因。 “选择一些东西从商店WHERE type = pack_of_gum”让你只是口香糖,并没有强迫你把几千瓶洗发水和一袋小猫垃圾带回家。
对于你的#3,是的。如果在LIMIT查询中有ORDER BY子句,则必须先对结果集进行排序,然后数据库才能确定这5条记录应该是什么。虽然它并不像实际将整个记录集转移到您的应用程序并且仅选择前五个记录那么糟糕,但它仍然需要更多的工作,而不仅仅是检索与您的WHERE子句匹配的前5条记录。