用PHP实现定时计划

文章分类:MySQL, PHP | 发表评论  查看次数:46 + 8

下面的这段代码,可以在当前文件夹下,生成一个test.txt,并每隔20秒,往里面写入一个时间戳,无论客户端是否关闭浏览器。

<?
ignore_user_abort(true);
set_time_limit(0);

function write_txt(){
    if(!file_exists("test.txt")){
        $fp = fopen("test.txt","wb");
        fclose($fp);
    }
    $str = file_get_contents('test.txt');
    $str .= "\r\n".date("H:i:s");
    $fp = fopen("test.txt","wb");
    fwrite($fp,$str);
    fclose($fp);
}

function do_cron(){
    usleep(20000000);
    write_txt();
}

while(1){
    do_cron();
}

Read more

一个练习SQL查询语句的小东东

文章分类:MySQL | 发表评论  查看次数:340 + 85

当然是用写的,左边列出了所有将会用到的数据,右边有5道小问题,通过输入语句,可以在上面的框框里显示语句执行的结果,对不对自己心里清楚。

安装方法:
修改db.里的用户名、密码和数据库,将test.导入到相应的数据库,应该就OK啦。

thumb.jpg

下载地址:点此下载

MySQL优化小技巧

文章分类:MySQL | 发表评论  查看次数:276 + 79

原文地址:click here

以下为译文


最近经常看到有人讨论的优化,可以理解,其实他们都没有尝试过在海量数据下,哪些因素会成为瓶颈。一些简单的建议 我不认为自己是专家,但我有在大数据量下工作的经验,以及自己总结的关于查询的优化。通过使用EXPLAIN来优化查询EXPLAIN 是你的朋友,你应该去了解她。如果你花时间去了解EXPLAIN的说明文档 的话,会发现许多有价值的东西,部分显示如下。

优化 JOIN

是通过但扫描多连接的方式来处理JOIN的,也就是说,首先从第一个表获取所有的行,然后从第二个表中查找匹配数据,接着是第三个,以此类推。当所有的表都被处理后,输出所选择的列然后撤出该表。

为什么这很重要?假设一个表(tableA)有8000条数据,这个表有一个对应的n:n的表(locations),存储的是tableA的location,可以这么来写这个查询

SELECT tableA.*, locations.location FROM tableA
LEFT JOIN tableA2locations ON
tableA2locations.tableA_id = tableA.id
LEFT JOIN locations ON
tableA2locations.location_id = locations.id
WHERE locations.location = 'sometown'
 

对这个查询语句留个印象。会首先从第一个表获取记录,然后从join table中筛选出符合的数据,以此类推。这将带领我们进入下一个话题

执行一个查询所需要的行数

通过观察EXPLAIN的输出可以对这个查询语句的优劣有一个大致的判断。她能够告诉你有多少条数据必须检测。

通过上面这个例子可以看出,如果一个表没有索引,那么在处理一个普通的3表查询(1000x1000x1000)时,一个join语句就有可能变得很慢。可以参考这篇文章

减少一个查询语句里面的行数

仍然拿上面那个例子来看,我们通过多一个where条件,来使得查询的行数减半(tableA.foo = 'bar')。

SELECT tableA.*, locations.location FROM tableA
LEFT JOIN tableA2locations ON
tableA2locations.tableA_id = tableA.id
LEFT JOIN locations ON
tableA2locations.location_id = locations.id
WHERE locations.location = 'sometown' AND tableA.foo = 'bar'
 

这样我们只需从tableA的4万条数据开始查询。如果tableA2locations还有2千条数据的话,总共是80,000(我不知道怎么来的)条数据。情况有些好转,但如果有3个表或者更多呢?答案应该是首先查询数量最少的表

SELECT tableA.*, locations.location FROM locations
LEFT JOIN tableA2locations ON
tableA2locations.location_id = locations.id
LEFT JOIN tableA ON
tableA2locations.tableA_id = tableA.id
WHERE locations.location = 'sometown' AND tableA.foo = 'bar'
 

如果tableA2locations和tableA都有做索引的话,那么查询将是相当快的。

最初我编程的时候,我总是先选择主表然后关联其他的表。但是当你添加一些数据后并开始使用EXPLAIN时,你会发现首先select行数最少的表是最佳选择。

如果想更深入地了解这个话题,可以到HackMySQL去看看。

不用插件,实现MySQL的中文全文索引

文章分类:MySQL | 发表评论  查看次数:520 + 88

这只是个缓军之计,更完美的方法,只能等待官方的支持或者自己编译带补丁的

以下方法并非本人原创,原作者为walkerlee

首先,我们来想想不支持中文索引的关键原因还是中文是双字节的,如果能把中文转换成单字节的字母或数字,那不就可以使用全文索引了吗

基于这个目的,我们首先需要做的就是分词,如果要实现比较完美的分词的话,还是需要安装相应的插件,但我们很多是虚拟主机,根本没有条件来安装,所以只能采取比较原始的分词方法,二元分词法。

所谓二元分词法,就是将一句话从头到尾,两个字两个字地分开,比如:我们的祖国是花园。就可以划分为:我们,们的,的祖,祖国,国是,是花,花园。虽然有点浪费,但至少面面俱到了。

Read more