如何使用大型查询数据加快PHP到MySQL的查询速度

时间:2015-07-21 07:32:39

标签: php mysql

代码前: for循环应运行至少143,792,640,000次,并创建表至少生成563,760行而不重复 我想知道如何加速或像Hadoop这样可以在php和MySQL之间加速的并行计算。

以下代码:

MySQL连接

$link=mysql_connect($servername,$username,$password);
mysql_select_db($dbname);
$sql= "INSERT INTO EM (source,target) VALUES ";

for循环读取数据到MySQL检查函数,如果重复不插入并更新count = count + 1

for($i=0;$i<$combine_arr_size;$i++){
    for($j=0;$j<$combine_arr_size;$j++){  

//下面检查是否找到重复的像a,b我们认识b,a是同一件事

if(check($combine_words_array[$i],$combine_words_array[$j])) {
                $update_query="UPDATE EM SET count = count+1 where (source='$combine_words_array[$i]' AND target='$combine_words_array[$j]') OR (source='$combine_words_array[$j]' AND target='$combine_words_array[$i]');";
                mysql_query($update_query);
            } else {
                if (!$link) {
                    die("Connection failed: " . mysql_error());
                }

//使用insert into table()值来连接字符串

    $sql.="('$combine_words_array[$i]','$combine_words_array[$j]'),";     
            mysql_query(substr($sql,0,-1));
            $sql= "INSERT INTO EM (source,target) VALUES ";        
        }
    }
} 

comebine_word_array[]combine_word_array[]

读取所有向量对齐

下面是检查功能,检查是否找到对返回值

function check($src, $trg) {
    $query = mysql_query("SELECT * FROM EM WHERE (source='$src' AND target='$trg') OR (source='$trg' AND target='$src');");
    if (mysql_num_rows($query) > 0) {
        return 1;
    } else {
        return 0;
    }
}

+--------+--------------+------+-----+---------+-------+
| Field  | Type         | Null | Key | Default | Extra |
+--------+--------------+------+-----+---------+-------+
| source | varchar(255) | YES  |     | NULL    |       |
| target | varchar(255) | YES  |     | NULL    |       |
| count  | int(11)      | NO   |     | 0       |       |
| prob   | double       | NO   |     | 0       |       |
+--------+--------------+------+-----+---------+-------+

现在php代码只影响源,目标和计数

2 个答案:

答案 0 :(得分:0)

在服务器上放置一个更好的处理器并增加RAM,然后转到php.ini设置并为所有各种内存/处理器相关配置提高最大分配内存。

这将进一步增强服务器的能力并提高运行效率。

如果找不到php.ini文件。创建一个包含以下内容的新php文件,并在浏览器中打开它:

<?php phpinfo(); ?>

确保在找到php.ini所在的位置后删除此文件...因为不需要的用户(黑客)可以找到此文件,它会向他们提供导致服务器配置漏洞的详细信息。

一旦你找到了php.ini,就可以在线查看一些不明显的设置并增加各个区域的内存分配。

答案 1 :(得分:0)

很难确切地知道您想要对重复组合做什么。例如,你得到了数组的每个组合,这将获得许多重复项,然后你将计算两次。

但是我很想把这些单词加载到一个表(可能是临时表)中,然后对表进行交叉连接以获得每个组合,并使用它来执行带有重复键子句的INSERT

非常粗暴,像这样: -

<?php

$sql = "CREATE TEMPORARY TABLE words
        (
            word varchar(255),
            PRIMARY KEY (`word`),
        )";

$link = mysql_connect($servername,$username,$password);
mysql_select_db($dbname);
$sql = "INSERT INTO words (word) VALUES ";
$sql_parm = array();

foreach($combine_words_array AS $combine_word)
{
    $sql_parm[] = "('".mysql_real_escape_string($combine_word)."')";
    if (count($sql_parm) > 500)
    {
        mysql_query($sql.implode(',', $sql_parm));
        $sql_parm = array();
    }
}

if (count($sql_parm) > 0)
{
    mysql_query($sql.implode(',', $sql_parm));
    $sql_parm = array();
}

$sql = "INSERT INTO EM(source, target)
        SELECT w1.word, w2.word
        FROM words w1
        CROSS JOIN words w2
        ON DUPLICATE KEY UPDATE `count` = `count` + 1
        ";

mysql_query($sql);

这确实依赖于包含源列和目标列的唯一键。

但是否这是一个选项取决于记录的细节。例如,如果有2个单词(例如A和B),您可以找到组合A / B和组合B / A的当前代码。但两种组合都会更新相同的记录