2015-12-09 3 views
1

Вопрос сначала, информация позже.PHP несколько одновременно выбирает?

В PHP есть ли способ отправить несколько SQL-запросов одновременно, и пусть mysql обрабатывает все выбранные одновременно?

Потому что ожидание всех ответов отдельно занимает слишком много времени.

Что мне нужно для кода?

У меня есть это:

$sqlStringArray[0=>"SELECT a,b,c,d,e,f FROM T1 JOIN (SELECT x... WHERE) AS RandomJoin WHERE... ORDER BY... GROUP BY....", 
      1=>"SELECT x,y FROM T2 WHERE...", 
      2=>"SELECT random FROM randomTable WHERE..."; 

Я использую что-то вроде этого:

/* This is not good enough, each select could take 2 seconds */ 
foreach ($sqlStringArray as $key => $value) { 
    $mysqli->query($value); 
} 

Я хочу что-то вроде этого:

$resultSet = $mysqli->executeAllSelectsAtTheSameTimeAsynchronous($sqlStringArray); 

(не обязательно читать ниже)

Я сора о моем английском, надеюсь, этого достаточно для понимания.

(Причина) У меня есть система контроля производительности, которая быстро растет (160 000 фильтруемых элементов, 280 счетчиков каждый, 4 записи/час каждого счетчика), около 4.300.800.000 новых записей/день.

Пользовательский интерфейс позволяет пользователям выбирать, какие счетчики они хотят, чтобы посмотреть, DateRange, формулы (например, Sum 2 счетчика, вычитать для этого другого, фильтр по регионам/имя/тип/ничего) ..

Все работает хорошо , но некоторые пользователи выбирают более 120 различных типов формул, и каждая формула будет возвращена к данным JSON, которые будут обрабатываться с помощью графических карт, которые будут отображаться в пользовательском интерфейсе, каждый выбор занимает около 2-5 секунд (я считаю, что сделал действительно отличная работа в избранной части, я не думаю, что смогу ее улучшить, потому что я не могу обобщить эти данные, когда каждый пользователь использует свои собственные формулы, и они выглядят случайным образом в сети [на самом деле выглядят только тогда, когда у них есть пользователь жалобы]).

Я хотел бы знать, есть ли какие-либо способы, которыми я могу отправить «список выбора», чтобы каждый раз обрабатывать mysql и возвращать кучу массивов.

@MyWay решил это, под некоторыми тестами (имя файла сам объясняет), я использовал одни и те же запросы во всех файлах, поэтому чем больше я запускаю, тем быстрее он не знает почему, но разница настолько велика, что никогда не бывало, по крайней мере в 8 раз быстрее.

[email protected]:/dev/shm/test/20151209$ php teste_diogo_sequential.php 
Memory spike: 
not real: 0.22097778320312 MiB 
real: 0.25 MiB 

Total execution time in seconds: 87.4132 

[email protected]:/dev/shm/test/20151209$ php teste_diogo_multiquery.php 
Memory spike: 
not real: 0.22097778320312 MiB 
real: 0.25 MiB 

Total execution time in seconds: 11.1795 

[email protected]:/dev/shm/test/20151209$ php teste_diogo_multiquery_JSON.php 
Memory spike: 
not real: 0.22097778320312 MiB 
real: 0.25 MiB 

Total execution time in seconds: 6.9231 

[email protected]:/dev/shm/test/20151209$ php teste_diogo_sequential.php 
Memory spike: 
not real: 0.22097778320312 MiB 
real: 0.25 MiB 

Total execution time in seconds: 62.1036 
+2

Вы пробовали multi_query ? http://php.net/manual/en/mysqli.multi-query.php – Thamilan

+0

Ой, нет, я попробую это прямо сейчас и верну вас, если вы опубликуете его как ответ, и я выберу его как ответил. @MyWay –

ответ

2

Использование PHP multi_query

<?php 
$conn = mysqli_connect("localhost", "username", "password", "db"); 
$query = "SELECT a,b,c,d,e,f FROM T1 JOIN (SELECT x... WHERE) AS RandomJoin WHERE... ORDER BY... GROUP BY....;"; 
$query .= "SELECT x,y FROM T2 WHERE...;"; 
$query .= "SELECT random FROM randomTable WHERE..."; 
if (mysqli_multi_query($conn, $query)) { 
    do { 
     if ($result = mysqli_store_result($conn)) { 
      while ($row = mysqli_fetch_row($result)) { 
       printf("%s\n", $row[0]); 
      } 
      mysqli_free_result($result); 
     } 
    } while (mysqli_next_result($conn)); 
} 

mysqli_close($conn); 
?> 

Другой SO question для эффективности между multi_query и запроса

+1

Работает от 60 + секунд до 9 секунд!: D Я отредактирую вопрос с результатами –

+1

Пока вы не забудете ';' между запросами ... –

1

попробовать Это он поможет вам использовать несколько выбора:

<?php 
    $con=mysqli_connect("localhost","my_user","my_password","my_db"); 
    // Check connection 
    if (mysqli_connect_errno()) 
     { 
     echo "Failed to connect to MySQL: " . mysqli_connect_error(); 
     } 

    $sql = "SELECT Lastname FROM Persons ORDER BY LastName;"; 
    $sql .= "SELECT Country FROM Customers"; 

    // Execute multi query 
    if (mysqli_multi_query($con,$sql)) 
    { 
     do 
     { 
     // Store first result set 
     if ($result=mysqli_store_result($con)) { 
      // Fetch one and one row 
      while ($row=mysqli_fetch_row($result)) 
      { 
      printf("%s\n",$row[0]); 
      } 
      // Free result set 
      mysqli_free_result($result); 
      } 
     } 
     while (mysqli_next_result($con)); 
    } 

    mysqli_close($con); 
    ?> 
Смежные вопросы