Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/237.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 依靠最大的表_Php_Mysql_Sql - Fatal编程技术网

Php 依靠最大的表

Php 依靠最大的表,php,mysql,sql,Php,Mysql,Sql,我的问题是在尝试获取大量记录(例如500.000)的查询返回计数时引起的: 例如: $limit = ' LIMIT 0,30'; $ResultQuery = mysql_query(" SELECT id, name, description, date FROM products WHERE name LIKE 'dog%'".$limit); $CountQuery = mysql_query(" SELECT COUNT(id)

我的问题是在尝试获取大量记录(例如500.000)的查询返回计数时引起的:

例如:

$limit = ' LIMIT 0,30';
$ResultQuery = mysql_query("
    SELECT id, name, description, date 
    FROM products 
    WHERE name 
    LIKE 'dog%'".$limit);

$CountQuery = mysql_query("
    SELECT COUNT(id) 
    FROM products 
    WHERE name LIKE 'dog%'");

while ($Product = mysql_fetch_assoc($ResultQuery)) { [...]
注意:使用COUNT(id)比使用mysql\u num\u$ResultQuery行更快(在我的例子中)

如果我看到服务器使用MySQL管理员在做什么,我会看到3秒进行1º查询(限制),1秒“发送数据”,143秒进行2º查询“发送数据”

我读了更多关于这个问题的文章,因为要获取查询的计数,需要扫描查询的所有行(不受限制)

不存在绕过此问题的任何方法或模式?有什么方法可以提取具有大量结果的行数


谢谢你的帮助。

我的最佳选择是你没有正确设置索引。从外观上看,您没有为
名称
字段设置适当的索引,这导致MySQL遍历每一行(超过2200000行)以查找
'dog%

$count =  mysql_num_rows($ResultQuery);
我建议您尝试使用常规索引并对结果进行基准测试

CREATE INDEX `idx_name` ON products (name)

我敢打赌你没有正确设置索引。从外观上看,您没有为
名称
字段设置适当的索引,这导致MySQL遍历每一行(超过2200000行)以查找
'dog%

我建议您尝试使用常规索引并对结果进行基准测试

CREATE INDEX `idx_name` ON products (name)

id |选择|类型|类型|可能的|键|键|列|参考|行|额外
1 |简单|产品|所有|名称|空|空|空| 22160980 |使用where

从上面可以看出,没有使用索引“name”。原因如下

您正在对“名称”列使用全文索引,该索引仅对全文搜索查询有用

如果不进行任何全文搜索,请删除该索引,然后按照上面的建议创建另一个索引

在产品(名称)上创建索引

这将在名称上创建一个BTREE索引,然后在搜索查询中使用该索引。请注意,如果在开始处使用“%”执行类似查询,则此索引将没有用处。比如说

从名称为“%dogs”的产品中选择计数(id)

不会使用索引


id |选择|类型|类型|可能的|键|键|列|参考|行|额外
1 |简单|产品|所有|名称|空|空|空| 22160980 |使用where

从上面可以看出,没有使用索引“name”。原因如下

您正在对“名称”列使用全文索引,该索引仅对全文搜索查询有用

如果不进行任何全文搜索,请删除该索引,然后按照上面的建议创建另一个索引

在产品(名称)上创建索引

这将在名称上创建一个BTREE索引,然后在搜索查询中使用该索引。请注意,如果在开始处使用“%”执行类似查询,则此索引将没有用处。比如说

从名称为“%dogs”的产品中选择计数(id)



将不使用索引。

您是否已将
索引设置为
名称
字段?是的,所有返回字段(描述除外)均为索引您有多少记录与“dog%”一起?如果有超过表的一半的记录,索引将无效,甚至比通常的FullScan更慢。索引是如何设置的?如果您设置了类似于(col1,col2,…,name)的索引,则无法将其用于此查询。请发布您的索引以及
EXPLAIN SELECT COUNT(id)的结果,这些产品的名称为'dog%'
id | SELECT|u type | table | type |可能的| key | key | len ref | rows |额外1 |简单的|产品| ALL | name | NULL | id | NULL | NULL | NULL | 22160980 |使用其中name是全文索引,INT(11)B树和日期为int(11)您是否已将
索引设置为
名称
字段?是的,所有返回字段(描述除外)均为索引您有多少记录与“dog%”一起?如果有超过表的一半的记录,索引将无效,甚至比通常的FullScan更慢。索引是如何设置的?如果您设置了类似于(col1,col2,…,name)的索引,则无法将其用于此查询。请发布您的索引以及
EXPLAIN SELECT COUNT(id)的结果,这些产品的名称为'dog%'
id | SELECT|u type | table | type |可能的| key | key | len ref | rows |额外1 |简单的|产品| ALL | name | NULL | id | NULL | NULL | NULL | 22160980 |使用其中name是全文索引,INT(11)B树和日期是int(11)这并没有给我总的结果(页数),给出第一次查询中的结果计数..OP特别提到这种方法要慢一些。好的,OP,我知道了。@gilden,你错了,OP指的是第二个查询的计数。这并没有给我总结果(页数),而是给第一个查询的结果计数。OP特别提到这种方法要慢一些。好的,OP,我知道了。@gilden,你错了,OP指的是第二个查询的计数。好的,我试试。例如,我需要FT索引,因为使用匹配进行搜索。我假设字段中只需要“额外”索引,而不是索引或全文否?您需要同时运行LIKE和MATCH查询吗?另外,优化匹配查询是否有任何问题?好的,我试试。例如,我需要FT索引,因为使用匹配进行搜索。我假设字段中只需要“额外”索引,而不是索引或全文否?您需要同时运行LIKE和MATCH查询吗?另外,您在优化匹配查询时是否遇到任何问题?