使用mysql从数据库中获取数据时程序无响应

问题描述 投票:-1回答:2

在我的mysql数据库中,我的行中有超过100万行。使用Join查询我获取了数据库,但是它需要更多的时间来检索数据,并且还需要时间来使用php中的foreach循环来显示数据。它显示错误,如程序无响应。

SQl查询是执行的,需要更多时间。在codeigniter中显示数据并使用jquery分页,也需要更多时间来显示。

我现在快速使用Codeigniter分页。但它在SQL中显示错误。请找到这个

Table name - catch_estimation
estiamteid int(11) PRI
centerid int(11)
centername varchar(100)
month int(2)
year int(5)
totalcatch int(11)
totalefforts int(11)
totalafh int(11)
noofgears int(11)
created_date datetime
modified_date datetime

表名为gearwise_estimation

id int(11) NO PRI
estimationid int(11)
centername varchar(50)
gearname varchar(20)
gear_totalefforts int(11)
gear_totalafh int(11)
gear_totalcatch int(11)

     $this->db->select('start.*');
    $this->db->from('gearwise_estimation');
    $this->db->join('catch_estimation', 'gearwise_estimation.estimationid = catch_estimation.estiamteid and year = '.$year);

   foreach($month as $mon):
        $this->db->like('catch_estimation.month',trim($mon));
    endforeach;

     foreach($gear as $gr):
        $this->db->like('gearwise_estimation.gearname',trim($gr));
    endforeach; 

   foreach($centername as $zo):
        $this->db->like('catch_estimation.centerid',trim($zo));
    endforeach;

    $this->db->order_by("catch_estimation.month", "asc");   
    $this->db->order_by("catch_estimation.centername", "asc");

但它显示错误

SELECT `start`.* FROM `gearwise_estimation` JOIN `catch_estimation` ON `gearwise_estimation`.`estimationid` = `catch_estimation`.`estiamteid` and `year` = 2018 WHERE catch_estimation.month LIKE '%8%' ESCAPE '!' AND catch_estimation.month LIKE '%9%' ESCAPE '!' AND gearwise_estimation.gearname LIKE '%OBGN%' ESCAPE '!' AND catch_estimation.centerid LIKE '%2%' ESCAPE '!' ORDER BY `catch_estimation`.`month` ASC, `catch_estimation`.`centername` ASC
mysql query-optimization codeigniter-3
2个回答
0
投票

如果表中有10万个+行,那么进行DOM级别分页是不可行的。目前你的分页是从数据库中获取所有10万行,然后在DOM级别上进行隐藏/显示以形成分页。

您应该在mysql中应用limit子句,然后只获取每页所需的记录。

See this供您参考。

一旦只显示所需的数据,就可以通过添加索引继续优化更多,使用Explain获取查询执行细节。


0
投票

你至少有INDEX(year)?还有每个表格中的estimateid索引(或PRIMARY KEY)?

你需要所有的栏目(SELECT *)吗?如果有任何TEXTBLOB,这可能特别昂贵。

你想要获得一百万(10万)行吗?网络可能会窒息。

PHP有一个内存限制,可能会在一次性抛出大量数据时窒息。

如果您首先获取所有行,分页是非常昂贵的。

如果你使用LIMITOFFSET,分页也很昂贵。

如果你“记住你离开的地方”,分页可以是有效的。见this

© www.soinside.com 2019 - 2024. All rights reserved.