PHP和Apache Ignite - 查询速度非常慢

时间:2017-12-07 07:50:41

标签: php pdo ignite

首先,对不起我的英语。

我开始使用Apache Ignite with PHP(PDO,UnixODBC,Ignite ODBC驱动程序)。我成功安装了它并在我的linux服务器(Debian)上配置了Ignite,DSN和ODBC。我安装了php-odbc扩展,一切看起来都很好。

我启动Apache Ignite:./bin/ignite.sh php-ignite.xml其中php-ignite.xml是我的配置(默认配置+ odbc启用):

<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
   xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/util
    http://www.springframework.org/schema/util/spring-util.xsd">
   <bean id="ignite.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">
   <!-- <property name="clientMode" value="true"/> -->
   <!-- Enabling ODBC. -->
   <property name="odbcConfiguration">
       <bean class="org.apache.ignite.configuration.OdbcConfiguration"></bean>
   </property>
</bean>

我编写了一个简单的PHP脚本,通过PDO与Ignite连接,并在其中添加了一些自定义数据:

<?php

try {

    $db = new PDO('odbc:Apache Ignite');
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $sql = 'CREATE TABLE IF NOT EXISTS test_md5 (id int PRIMARY KEY, md5_1 VARCHAR, md5_2 VARCHAR, md5_3 VARCHAR, md5_4 VARCHAR, md5_5 VARCHAR, md5_6 VARCHAR, md5_7 VARCHAR, md5_8 VARCHAR, md5_9 VARCHAR) WITH "atomicity=transactional,cachegroup=somegroup"';

    $db->exec($sql);

    for($i=0; $i<=1000000; $i++){
        $md5 = md5($i);
        $sql = "INSERT INTO test_md5 (id, md5_1, md5_2, md5_3, md5_4, md5_5, md5_6, md5_7, md5_8, md5_9) VALUES ($i, '$md5', '$md5', '$md5', '$md5', '$md5', '$md5', '$md5', '$md5', '$md5');";
        $db->exec($sql);
    }


} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "\n";
    die();
}

在这一点上,每个人都很好看。数据设置为群集。现在我不会做一些测试,检查Apache Ignite是否是比MySQL更快的大数据解决方案。这是我的测试(仅限简单选择):

<?php

error_reporting(E_ALL);
$startTime = microtime(true);

try {

    $ignite = new PDO('odbc:Apache Ignite');
    $ignite->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $nRows = $ignite->query('select count(*) from test_md5')->fetchColumn(); 
    echo 'Rows count: '.$nRows.'<br><br>';

    $stmt = $ignite->prepare("select * from test_md5 limit 60500,10");
    $stmt->execute();
    $rows = $stmt->fetchAll();

    foreach($rows as $item){
        echo 'id: '.$item['ID'].' - md5: '.$item['MD5_1'].'<br>';
    }


} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "\n";
    die();
}

echo "<br><br>Speed test:  " . number_format(( microtime(true) - $startTime), 4) . " Seconds\n";

结果:速度测试:1.3717秒 我的问题是:为什么Apache Ignite工作这么慢?

当我对MySQL做同样的事情时,结果要快得多:速度测试:0.0019秒

当然这是一个简单的测试,但我不想使用Apache Ignite来处理大数据。

如何配置Ignite corectly?

我做错了什么?

编辑:

因此,问题在于偏移和单机比较情况。本文可以提供帮助:http://apache-ignite-users.70518.x6.nabble.com/PHP-and-Apache-Ignite-very-slow-query-td18857.html

1 个答案:

答案 0 :(得分:1)

首先,如果要比较性能,则应使用完全相同的代码。您对Ignite使用ODBC驱动程序,但是您说您使用默认的MySQL驱动程序。你甚至用PHP进行MySQL测试吗?在您的基准测试中,目前还不清楚您是否正在对Ignite,PDO或PHP I / O本身进行基准测试。尝试使用完全相同的MySQL代码 - 它可以使事情更清楚。

其次,Ignite是用Java编写的,可以在JVM上运行。这意味着您需要“预热”它以获得实际数字,您将在生产中看到它们。在刚刚开始的“冷”JVM上观察到的性能可能会低很多,并且没有对其运行单个查询。