Witam serdecznie,

Aby przyśpieszyć zapytania SQL'owe w systemie webowym z bazą danych (w MySQL), którą śmiało można nazwać Big Data postanowiliśmy wdrożyć (przynajmniej potestować na chwilę obecną), Apache Ignite. Na początek chciałem wykonać kilka testów. Udało mi się zainstalować Ignite oraz skompilować driver ODBC (wraz ze wszystkimi zależnościami jak php-odbc itp.). Mój serwer stoi na Debianie. Skonfigurowałem wszystko jak należy i uruchomiłem Ignite poprzez wywołanie './bin/ignite.sh php-ignite.xml' gdzie w pliku 'php-ignite.xml' jest zapisana moja konfiguracja (domyślna konfiguracja Ignite + włączenie ODBC):

<?xml version="1.0" encoding="UTF-8"?>

<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>
</beans>

Wszystko działa. Teraz napisałem prosty skrypt w PHP aby utworzyć tabelę i zapełnić ją przykładowymi danymi (w celu zasymulowania big data - choć nie jest ona so big):

<?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();
	}
	
?>

Do tego momentu wszystko wygląda nieźle. Teraz chciałem przeprowadzić prosty test szybkości aby przekonać się że Apache Ignite jest lepszym rozwiązaniem dla big data aniżeli MySQL. W tym celu wywołałem z poziomu PHP proste zapytania wraz ze śledzeniem czasu wykonywania się skryptu:

<?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";
	
?>

I tutaj pojawia się problem. Skrypt wykonuje się, jednak działa bardzo wolno. Moje rezultaty to: Speed test: 1.3717 Seconds

Stąd moje pytanie jest następujące: Co robię nie tak? Dlaczego Apache Ignite działa tak wolno? Co powinienem zrobić aby kwerendy wykonywały się z oczekiwaną szybkością? Czy problem może dotyczyć konfiguracji (w moim mniemaniu tutaj powinienem szukać rozwiązania)?

Dla porównania wykonanie powyższych skryptów z wykorzystaniem standardowego połączenia PDO MySQL daje rezultaty: Speed test: 0.0019 Seconds

Z góry dziękuje za wszelkie pomocne wskazówki.