Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: ALTER TABLE `table` DISABLE KEYS работает медленнее чем когда включена индексация.
Форумы портала PHP.SU » PHP » SQL и Архитектура БД » ALTER TABLE `table` DISABLE KEYS работает медленнее чем когда включена индексация.

Страниц (1): [1]
 

1. Bilka - 21 Декабря, 2016 - 23:44:21 - перейти к сообщению
Здраствуйте.


использую PHP PDO для работы с базой, з mysqli тлже самое.


PHP:
скопировать код в буфер обмена
  1. //================================================
  2. здесь некоторый код
  3. //================================================
  4. //отключаю индекс
  5. try {  
  6.                 $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  7.                 $s_1 = "ALTER TABLE t1 DISABLE KEYS";
  8.                 $s_2 = "ALTER TABLE t2 DISABLE KEYS";
  9.                 $s_3 = "ALTER TABLE t3 DISABLE KEYS";
  10.                 $s_4 = "ALTER TABLE t4 DISABLE KEYS";
  11.                 $s_5 = "ALTER TABLE t5 DISABLE KEYS";
  12.                 $dbh->exec($s_1);
  13.                 $dbh->exec($s_2);
  14.                 $dbh->exec($s_3);
  15.                 $dbh->exec($s_4);
  16.                 $dbh->exec($s_5);
  17.                
  18.         } catch (Exception $e) {
  19.                 echo $e->getMessage();
  20.         }
  21. //===================================  
  22. здесь некоторый код
  23. //===================================  
  24. $s_1 = ...;
  25. $s_2 = ...;
  26. $s_3 = ...;
  27. $s_4 = ...;
  28. $s_5 = ...;
  29. //==============================================
  30. //здесь несколько тысяч запросов inser в 5 таблиц (крутетса в цыкле)
  31.  
  32.         try {  
  33.         $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  34.         $dbh->beginTransaction();
  35.         $dbh->exec($s_1);
  36.         $dbh->exec($s_2);
  37.         $dbh->exec($s_3);
  38.         $dbh->exec($s_4);
  39.         $dbh->exec($s_5);
  40.         $dbh->commit();
  41.         } catch (Exception $e) {
  42.         $dbh->rollBack();
  43.         echo   $e->getMessage();
  44.         }
  45.  
  46. //================================================
  47.  
  48.  
  49. //включаю индекс
  50. try {  
  51.                 $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  52.                 $s_1 = "ALTER TABLE t1 ENABLE KEYS";
  53.                 $s_2 = "ALTER TABLE t2 ENABLE KEYS";
  54.                 $s_3 = "ALTER TABLE t3 ENABLE KEYS";
  55.                 $s_4 = "ALTER TABLE t4 ENABLE KEYS";
  56.                 $s_5 = "ALTER TABLE t5 ENABLE KEYS";
  57.                 $dbh->exec($s_1);
  58.                 $dbh->exec($s_2);
  59.                 $dbh->exec($s_3);
  60.                 $dbh->exec($s_4);
  61.                 $dbh->exec($s_5);
  62.                
  63.         } catch (Exception $e) {
  64.                 echo  $e->getMessage();
  65.         }
  66.  
  67.  
  68. //======================================================


в результате с выключением индексов работает на 20% медленнее, чем простой insert
таблицы myisam

+каждый следующий раз выполнения кода происходит медленнее. Почему? потому что в таблице записей становится все больше?
2. Мелкий - 22 Декабря, 2016 - 10:39:49 - перейти к сообщению
Bilka пишет:
таблицы myisam

Bilka пишет:
$dbh->beginTransaction();

А смысл?

Чем извращаться с отключением индексов запишите всё в temporary table и затем перенесите всё одним insert ... select для каждой таблицы.
3. Bilka - 26 Декабря, 2016 - 11:57:22 - перейти к сообщению
Мелкий пишет:
А смысл?

по идее быстро должно быть.
4. Мелкий - 26 Декабря, 2016 - 12:21:49 - перейти к сообщению
С чего бы?
Для реплики объём данных будет тот же.
Для wal - да не пишет myisam wal вообще. Большая куча бинарного мусора, иногда прикидывающаяся способной прочитать то, что в неё записали.
Заворачивать myisam в транзакцию не только бесполезно, но ещё и вредно. Вот так посмотрите код и решите, что раз exec($s_3) сфейлился, значит s_2 и s_1 откатились.

 

Powered by ExBB FM 1.0 RC1