1.关掉安全机制
SQLite有一个自定义的SQL语句:PRAGMA,其中包括了很多性能选项(具体百度)。其中,synchronous(内建的写入安全机制)最影响性能。在连接数据库后立即执行PRAGMA synchronous=0就可以关掉了,insert和update速度不知快了多少倍!
例:
$db=new PDO('sqlite:test.db3');
$db->exec('PRAGMA synchronous=0');
对于虎绿林,采集以下文件保存到对应位置就可以关闭安全机制了。
/wap/0wap/class/db.class.php.gz/wap/db/db.php.gz关闭后,如果突然断电,数据库有小概率损坏,但一般没啥影响。
2.优化索引
之前虎绿林的索引烂的一踏糊涂。我天真地以为只要建一个包含所有需要排序的列的索引就行了。于是出现了这样的索引。
create index tz_index on tz(bkid,youxian,fttime,hftime,uid,ftcount,hfcount)
懂索引的肯定笑疯了。
后来我的测试结果表明:在大多数查询时,这索引根本不能用!
原来,我们必须为每一种查询方式建立独立的引。比如:
select * from tz where bkid=5 order by youxian desc,fttime desc limit 0,20
这里,我们就需要两个索引,create index a on tz(bkid)和create index b on tz(youxian,fttime)
下面开始更新索引。进执行SQL,目标bbs.db3。
首先执行
select name from sqlite_master where type='index'把所有不是sqlite_开头的索引都删除。
比如,你看到了一个name=>tz_a的索引,就执行drop index tz_a
然后,依次执行以下SQL建立索引:
CREATE INDEX tz_u on tz(uid)
CREATE INDEX tz_ft on tz(fttime)
CREATE INDEX bk_ns on bk(notshow)
CREATE INDEX tz_bk on tz(bkid)
CREATE INDEX bk_y on bk(youxian)
CREATE INDEX qu_y on qu(youxian)
CREATE INDEX tz_yt on tz(youxian,fttime)
CREATE INDEX tz_rh on tz(rdcount,hfcount)
CREATE INDEX tz_ht on tz(hftime)
CREATE INDEX hf_tz on hf(tzid)
CREATE INDEX hf_yt on hf(youxian,hftime)
CREATE INDEX fl_tz on file(tzid)
CREATE INDEX fl_u on file(uid)
无法建立某些索引是正常的:不同版本的表结构不同。
索引可以加快需要排序的查询的读取速度,减少磁盘I/O。
顺便发下user.db3的索引。第一步也是删除已有索引。
CREATE INDEX msg_u on msg(uid)
CREATE INDEX msg_bu on msg(byuid)
CREATE INDEX msg_t on msg(time)
CREATE UNIQUE INDEX u_sid on user(sid)
CREATE UNIQUE INDEX u_name on user(name)
建了这么多索引,会不会很晕?但这是我测试发现的比较好的结果。如果你有经验,可以提出建议。
第一步必做,否则再多的索引也没明显效果!
所有版本的虎绿林都可以进行第一步。
经过优化后,你的速度应该和虎绿林主站差不多了,大部分情况下都能在1秒内完成各种操作。