为什么会为什么会越来越慢?
因为创建索引时用limit分段加载创建,limit 10000,20的意思扫描满足条件的10020行,扔掉前面的10000行,返回最后的20行,问题就在这里。当数据越来越大时,速度越来越慢。
新问题:当数据量太大时,后面数据不会创建索引,猜测是数据加入太快的原因,所以加入一个间隔时间,代码加在下面了
废话不多说直接上解决办法:
修改util\XSDataSource.class.php 这个文件的内容
一、修改XSDataSource类
1.增加全局变量$previd
protected $inCli;
private $dataList, $dataPos;
protected $previd = 0;//上次执行得到的最大id
2.修改getData方法,把最后一条数据的id赋值给$previd
final public function getData()
{
if ($this->dataPos === null || $this->dataPos === count($this->dataList)) {
$this->dataPos = 0;
$this->dataList = $this->getDataList();
if (!is_array($this->dataList) || count($this->dataList) === 0) {
$this->deinit();
$this->dataList = $this->dataPos = null;
return false;
}
}
$data = $this->dataList[$this->dataPos];
$this->dataPos++;
$this->previd = $data["id"];//循环赋值,最后剩下的肯定最大
return $data;
}
二、XSDatabaseDataSource类
1. 修改getDataList方法
if ($this->limit <= 0) {
return false;
}
$wheresql=" where id > ".$this->previd." order by id asc";
//判断是否存在whereif(stripos($this->sql, "where") >0){
$wheresql=" and id > ".$this->previd." order by id asc";
}
$sql = $this->sql .$wheresql. ' LIMIT ' . min(self::PLIMIT, $this->limit) . ' OFFSET ' . $this->offset;
//构造出来的sql语句:select id,title,content from article where id>100000 order by id asc limit 1000 offset 0,
$this->limit -= self::PLIMIT;
//$this->offset += self::PLIMIT;//隐藏此处,offset便不会自增长
return $this->db->query($sql);
最后测试
1400w条数据创建索引用时20分钟