我的表中有很多行,table_1
。有时我只需要检索一个特定的行。MySQL中优化的SELECT查询
我假设,当我用WHERE子句使用SELECT查询时,它循环遍历第一行,直到它符合我的要求。
有什么办法让查询跳转到特定的行,然后从该行开始?
例子:
假设有5000万行,我要搜索的ID是53750.我需要的是:搜索可以从50000开始,以便它可以节省时间用于搜索49999行。
因为我不是SQL专家,所以我不知道确切的术语!
我的表中有很多行,table_1
。有时我只需要检索一个特定的行。MySQL中优化的SELECT查询
我假设,当我用WHERE子句使用SELECT查询时,它循环遍历第一行,直到它符合我的要求。
有什么办法让查询跳转到特定的行,然后从该行开始?
例子:
假设有5000万行,我要搜索的ID是53750.我需要的是:搜索可以从50000开始,以便它可以节省时间用于搜索49999行。
因为我不是SQL专家,所以我不知道确切的术语!
我的理解是,要选择ID为53750.行如果您有名为id你可以这样做一个领域:
SELECT * FROM table_1 WHERE id = 53750
随着索引ID字段。这是最快的方法。我所知道的。
我相信OP想知道如何在特定的ID处开始查询,然后向上找到它(也就是说在运行时会找到id),所以我不确定你的答案在这方面真的有帮助。但是,这个指数肯定会让情况变得更好。 – Lighthart 2013-02-27 07:48:47
我的错。我误解了这个问题。 – 2013-02-27 08:05:18
您需要创建一个索引:http://dev.mysql.com/doc/refman/5.1/en/create-index.html
ALTER TABLE_1 ADD UNIQUE INDEX (ID);
ALTER table_1 ADD UNIQUE INDEX (<collumn>)
将是一个伟大的第一步,如果没有自动生成它。您还可以使用:
EXPLAIN <your query here>
查看哪种查询在这种情况下效果最好。请注意,如果您想更改where语句(将来的任何地方),但在那里看到返回值,那么也可以将索引放在那里。
创建的列的索引,你想要做的SELECT
上:
CREATE INDEX index_1 ON table_1 (id);
然后,选择就像你前行。
但是,请阅读数据库,数据库设计和优化。你的问题充满了错误的假设。不要仅仅复制和粘贴我们的答案。受过教育!
关于优化选择查询有几件事要知道,如Range和Where clause优化,文档是相当丰富的baout这个问题,请阅读部分:Optimizing SELECT Statements。您评估的列上的Creating an index对性能也非常有帮助。
一个可能的解决方案您可以创建视图,然后从视图查询。这里是创建视图的细节,并从视图中获得数据
http://www.w3schools.com/sql/sql_view.asp
现在你只拆分巨大的行数为许多视图(即行1-10000在一个视图然后10001-20000另一种观点)
然后从视图查询。
我非常确定,任何对自己有点尊重的SQL数据库都不会从第一行开始循环以获取所需的行。但我也不确定他们是如何使它工作的,所以我不能给出确切的答案。
您可以查看WHERE子句中的内容以及表的索引。你有合适的主键吗?就像为此使用数字数据类型一样。你有更多列的索引,用于查询吗?
安装数据库服务器时也有很多concided,比如放置数据和日志文件的位置,为服务器提供多少内存以及设置增长。你可以做很多事情来调整你的服务器。
你可以尝试这个简单。
query = "SELECT * FROM tblname LIMIT 50000,0
我刚刚用phpmyadmin试了一下。其中“50,000”是查找的起始行。
编辑: 但是,如果我我们是你我不会使用这一个,因为它会失去1 - 49999记录搜索。
如果使用ID 53750记录不在第50,000行之后,但在它之前呢? MySQL不保证记录的存储方式。 – 2013-02-27 07:54:16
作为我编辑它,我不保证你使用那一个。您可以使用二分搜索而不是线性搜索。去谷歌上查询。 – 2013-02-27 07:56:32
或者让MySQL执行搜索。如果你已经设计好数据库,它就会非常好。 – 2013-02-27 07:57:48
你可以尝试在partitions
More about alter tables to add partitions
Selecting from a specific partition
分割你的表在你的情况,你可以为每个50.000行创建ID的分区,当你想跳过第一50.000你只需从分区2中选择。如何做到这一点在MySQL文档中有很好的解释。
我认为你需要做一个索引。在id字段上有一个聚簇索引,你的数据库引擎将能够直接进入好记录而不会循环。 – 2013-02-27 07:45:23
那么,正如我所说我不是专家,请你详细说明一下吗? – 2013-02-27 07:46:02
http://hackmysql.com/case1 – Cris 2013-02-27 07:46:57