PHP рдХреЗ рд▓рд┐рдП рдЯреНрдпреВрдирд┐рдВрдЧ SQLite


рдпрд╣ рдЖрд▓реЗрдЦ PHP рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП SQLite рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рдЖрдХрд▓рди рдХрд░рддрд╛ рд╣реИ, рдмрд╣реБрд╕реНрддрд░реАрдп рдХрд╛рдо рдХреА рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдФрд░ рдХрд╛рдо рдХреЛ рдЧрддрд┐ рджреЗрдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛ рд╣реИред "рдорд┐рдард╛рдИ рдХреЗ рд▓рд┐рдП" - рдЕрдиреНрдп DBMS (MySQL, PosgreSQL, MS SQL, MongoDB) рдХреЗ рд╕рд╛рде рдПрдХ рдЫреЛрдЯреА рддреБрд▓рдирд╛ред

рд╢реБрд░реБрдЖрдд


рдмрд╣реБрдд рдкрд╣рд▓реЗ рдирд╣реАрдВ, рдореИрдВ рдЕрдкрдиреА рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рдЪрд╛рд░ рдХреЛрдб рдХреА рдЕрдкрдиреА рд╕реЗрд╡рд╛ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдордВрдЪ рдХреЗ рдЪреБрдирд╛рд╡ рдореЗрдВ, рдореИрдВрдиреЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рд╕рдВрджреЗрд╣ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдЪреВрдВрдХрд┐ рдореЗрд░реЗ рдкрд╛рд╕ рдПрдХ рддреИрдирд╛рдд PHP рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░реНрд╡рд░ рд╣реИ, рд╕реЗрд╡рд╛ рд╕реНрд╡рдпрдВ рдХреЛ PHP рдореЗрдВ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ (рд╡рд┐рд╢реЗрд╖рдХрд░ рдЬрдм рд╕реЗ рдореИрдВ рдЗрд╕рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реВрдВ)ред DBMS рдХреЗ рд░реВрдк рдореЗрдВ, рдореИрдВ SQLite (рд╣рд╛рд▓рд╛рдВрдХрд┐ MySQL рдФрд░ PostgreSQL рд╕рд░реНрд╡рд░ рдкрд░ рддреИрдирд╛рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ) рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ "рдореБрдХрд╛рдмрд▓рд╛" рд╡рд╛рддрд╛рд╡рд░рдг рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ (рдмрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдХреА рдирдХрд▓ рдХрд░реЗрдВ), рдЗрд╕реЗ "рдирдВрдЧреЗ" рд╕рд░реНрд╡рд░ рдкрд░ рддреИрдирд╛рдд рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ (рдЖрдкрдХреЛ PHP рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреБрдЫ рднреА рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИ)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВ рдмреИрдХрдЕрдк рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ (рдореИрдВрдиреЗ рдбрд┐рд╕реНрдХ рд╕реНрдиреИрдкрд╢реЙрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдИ + рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк "рд╕реНрд▓рд╛рдЗрд╕" рдХреА рд╕рд░рд▓ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐)ред

рд▓реЗрдХрд┐рди рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдЗрд╕ рд╕рдорд╛рдзрд╛рди рдХреА рдкреНрд░рдпреЛрдЬреНрдпрддрд╛ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред

рд▓реЛрд╣рд╛


2 рд╡рд╕реНрддреБрдУрдВ рдкрд░ рдкрд░реАрдХреНрд╖рдг рд╣реБрдЖ:


рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдореВрд▓реНрдпрд╛рдВрдХрди


рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкреНрд░рджрд░реНрд╢рди рдореВрд▓реНрдпрд╛рдВрдХрди рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦреА рдЧрдИ рдереА:
<?php //   function initDB() { $guid = ''; //      if (function_exists('com_create_guid') === true) { $guid = trim(com_create_guid(), '{}'); } else { $guid = sprintf('%04X%04X-%04X-%04X-%04X-%04X%04X%04X', mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(16384, 20479), mt_rand(32768, 49151), mt_rand(0, 65535), mt_rand(0, 65535), mt_rand(0, 65535)); } //     $file = "_$guid.db"; //   ( ) $db = new SQLite3($file); //   $db->exec('CREATE TABLE foo (i INT, i2 INT)'); return $db; } //    function testDB($db, $count) { for ($i=0; $i<$count; $i++) testIteration($db, $i); } // 1   function testIteration($db, $iteration) { $db->exec('INSERT INTO foo VALUES ('.$iteration.', 1)'); } // ----------     ---------- //    $COUNT = 1000.0; if(isset($_REQUEST['COUNT'])) $COUNT = $_REQUEST['COUNT']; //   $db = initDB(); //    $start = microtime(true); //   testDB($db, $COUNT); //   $time = microtime(true) - $start; //   echo "$COUNT inserts per " . number_format($time, 2) . "sec. " . number_format($COUNT / $time, 2) . " operation per second"; ?> 

рд╣рдо рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рддрд╛рд▓рд┐рдХрд╛ рдореЗрдВ 1000 рд░рд┐рдХреЙрд░реНрдб рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдЦрд░реНрдЪ рдХрд┐рдП рдЧрдП рд╕рдордп рдХреЛ рдорд╛рдкрддреЗ рд╣реИрдВред рд╣рдо рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рд╕рдВрдЪрд╛рд▓рди рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВред
рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдореЛрдЯреЗ рддреМрд░ рдкрд░ рдореВрд▓реНрдпрд╛рдВрдХрди рдХреЗ рд▓рд┐рдП, рдЕрдзрд┐рдХ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдореИрдВрдиреЗ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд▓реЗрдирджреЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдСрдкрд░реЗрд╢рди рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд▓реЗрдирджреЗрди рдореЗрдВ рдЬрд╛рдПрдЧрд╛ред рдСрдкрд░реЗрд╢рди рдХрд╛ рдпрд╣ рдореЛрдб рдорд▓реНрдЯреАрдереНрд░реЗрдбреЗрдб рдореЛрдб рдореЗрдВ рдЖрдзрд╛рд░ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рдХрд░реАрдм рд╣реИред

рдФрд░ рдЕрдм рдкрд░рд┐рдгрд╛рдо:
рдПрд╕рдПрд╕рдбреА рдХреЗ рд▓рд┐рдП , рдЙрдиреНрд╣реЗрдВ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 365 рдСрдкрд░реЗрд╢рди рдХрд╛ рд╕реНрдХреЛрд░ рдорд┐рд▓рд╛ред рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИред
рдПрдЪрдбреАрдбреА рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ 13 рдСрдкрд░реЗрд╢рди рдорд┐рд▓реЗред рдпрд╣ рджреБрдЦрдж рд╣реИред рд▓реЗрдХрд┐рди рд╕рд░реНрд╡рд░ рдХреНрдпрд╛ рдХрд╣реЗрдЧрд╛?
рдФрд░ рд╕рд░реНрд╡рд░ рдкреНрд░рд╕рдиреНрди рд╣реБрдЖред 210 рдСрдкрд░реЗрд╢рдиред
рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рд╕рд░реНрд╡рд░ рдкрд░ рдкреНрд░рджрд░реНрд╢рди рд░реЗрдЯрд┐рдВрдЧ рдХрд╛рдлреА рд╕рднреНрдп рд╣реЛрддреА рд╣реИред рдЖрдк SQLite рдХреЗ рд╕рд╛рде PHP рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВред рдмрд╕ рддреБрд░рдВрдд рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдлрд╛рд╕реНрдЯ рдлрд╛рдЗрд▓ рд╕рдмрд╕рд┐рд╕реНрдЯрдо (рдПрд╕рдПрд╕рдбреА) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдХрд╣рд╛, рдмрд╛рджрд▓ рдХрд╛ рдЪрдпрди рд╕реЗрд▓реЗрд▓ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред SSD рдбрд┐рд╕реНрдХ рдФрд░ рдХреНрд▓рд╛рдЙрдб рдорд╢реАрдиреЛрдВ рдХреЗ рдмреАрдЪ рдХреИрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ (рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдХреБрдЦреНрдпрд╛рдд рдЕрдорд░реЛ рдХреА рдХрд╣рд╛рдирд┐рдпреЛрдВ рд╕реЗ рд╕рдордЭрд╛ рдерд╛)ред

рдмрд╣реБрдЖрдпрд╛рдореА рдСрдкрд░реЗрд╢рди


рдЕрдм рдЗрд╕ рд╕рд╡рд╛рд▓ рдХрд╛ рдЬрд╡рд╛рдм рджреЗрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ рдЖрдзрд╛рд░ рдорд▓реНрдЯреА-рдереНрд░реЗрдбреЗрдб рдореЛрдб рдореЗрдВ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдЧрд╛ рдпрд╛ рдирд╣реАрдВред
рд╣рдордиреЗ SQLite рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓реЗрдЦреЛрдВ рдХреА рдПрдХ рдЕрджреНрднреБрдд рд╢реНрд░реГрдВрдЦрд▓рд╛ рдкрдврд╝реА: habrahabr.ru/post/149356
рдФрд░ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдореЛрдб рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╡рд╛рд▓-рд▓реЙрдЧ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдбреЗрдЯрд╛рдмреЗрд╕ рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝реЗрдВ (рдЦреЛрд▓рдиреЗ рдХреЗ рдмрд╛рдж):
 $db->exec('PRAGMA journal_mode=WAL;'); 

рдФрд░ рддреБрд░рдВрдд рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдПрдВ:
рдПрд╕рдПрд╕рдбреА: рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 2000 рд▓реЗрдирджреЗрдиред рд╕рдВрдХреЗрддрдХ 5 рдЧреБрдирд╛ рд╕реЗ рдЕрдзрд┐рдХ рд╣реЛ рдЧрдпрд╛ рд╣реИ!
HDD: 42 рдСрдкрд░реЗрд╢рдиред 3 рдЧреБрдирд╛ рд╡реГрджреНрдзрд┐ред
рд╕рд░реНрд╡рд░: 1000 рдСрдкрд░реЗрд╢рдиред рд╡рд┐рдХрд╛рд╕ рд▓рдЧрднрдЧ 5 рдЧреБрдирд╛ рд╣реИред

рдмрд╣реБрдд рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдкрд░рд┐рдгрд╛рдоред рд▓реЙрдЧ рдореЛрдб рдореЗрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдкрд░рд┐рд╡рд░реНрддрди 5 рдЧреБрдирд╛ рд╡реГрджреНрдзрд┐ рджреЗрддрд╛ рд╣реИред
рдЕрдЧрд▓рд╛ рдХрджрдо рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реИред
рд╣рдо рдХрдИ рдереНрд░реЗрдбреНрд╕ (рд╕рд╛рдЗрдЯреЛрдВ рдХреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдХрд░реАрдм) рдореЗрдВ рдХрдИ рдмрд╛рд░ PHP рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдПрдмреА (рдЕрдкрд╛рдЪреЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
 ab -n 1000 -c 10 "http://localhost:81/test/benc_sqlite.php" 

рдкрд░рд┐рдгрд╛рдореА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкрд╛рда:
 <?php function openDB() { //     $file = "_TEMP.db"; //   ( ) $db = new SQLite3($file); //   $db->busyTimeout(5000); $db->exec('PRAGMA journal_mode=WAL;'); return $db; } //   function initDB() { $db = openDB(); //   $db->exec('CREATE TABLE foo (i INT, i2 INT)'); return $db; } //    function testDB($db, $count) { return testIteration($db, mt_rand(0, 1000)); } // 1   function testIteration($db, $iteration) { return $db->exec('INSERT INTO foo VALUES ('.$iteration.', 1)'); } // ----------     ---------- //   if(isset($_REQUEST['init'])) $db = initDB(); else $db = openDB(); //   if(testDB($db, 1)) echo 'OK'; else echo 'FAIL'; ?> 

рд╕рдореНрдорд┐рд▓рди рдХреА рдЧрддрд┐ рдХрд╛ рдорд╛рдкрди рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдЪрд▓рд╛ рдЧрдпрд╛ рд╣реИ, рдПрдмреА рд╣рдореЗрдВ рдпрд╣ рджреЗрдЧрд╛ред рдЕрдм рдЖрд░рдВрднреАрдХрд░рдг рдХреЗрд╡рд▓ 1 рдмрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рд░реНрдп рдкреНрд░рдЧрддрд┐ рдкрд░ рд╣реИред
рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рд╕реНрдерд╛рдкрд┐рдд
 $db->busyTimeout(5000); 

рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рддрд╛рдХрд┐ рдЬрдм рдорд▓реНрдЯреАрдереНрд░реЗрдб рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдЬрд╛рдП, рддреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЕрдкрдиреА рдХрддрд╛рд░ рдореЗрдВ рдереЛрдбрд╝реА рджреЗрд░ (рдореИрдВ 5 рд╕реЗрдХрдВрдб рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реВрдВ) рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рдФрд░ рдЗрд╕ рддрдереНрдп рдХреЗ рд╕рд╛рде рддреБрд░рдВрдд рдЧрд┐рд░ рди рдЬрд╛рдП рдХрд┐ "SQLITE_BUSY"ред

рдкрд░рд┐рдгрд╛рдо:
SSD: 970 рдСрдкрд░реЗрд╢рди рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдбред рдкрд░реНрдпрд╛рдкреНрдд рд╕реЗ рдЕрдзрд┐рдХред
HDD: 35 рдСрдкрд░реЗрд╢рдиред
рд╕рд░реНрд╡рд░: рд╕реНрдерд╛рдиреАрдп рдорд╢реАрди рд╕реЗ рдкрд░реАрдХреНрд╖рдг рдХрд░рддреЗ рд╕рдордп 90 рдСрдкрд░реЗрд╢рди рдФрд░ рд╕рд░реНрд╡рд░ рд╕реЗ рдПрдмреА рд╢реБрд░реВ рдХрд░рддреЗ рд╕рдордп 210ред рдПрдХ рдПрд╕рдПрд╕рдбреА рдкрд░ рдЪрд▓рдиреЗ рдХреЗ рд╕рд╛рде рдПрдХ рдмрд╣реБрдд рдмрдбрд╝рд╛ рдЕрдВрддрд░ред рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░, рдпрд╣ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрдВ рдЕрдВрддрд░ рдХреЗ рдХрд╛рд░рдг рд╣реИ (рдЕрдкрд╛рдЪреЗ рд╕рд░реНрд╡рд░ рдкрд░, рдпрд╣ рдиреНрдпреВрдирддрдо рд╕рдВрднрд╡ рдореЗрдВ рдХрдЯ рдЬрд╛рддрд╛ рд╣реИ)ред
рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╕реНрдерд╛рдиреАрдп рд╕рдВрдХреЗрддрдХ рдмрд╣реБрдд рдЕрдзрд┐рдХ рддреИрд░рддреЗ рд╣реИрдВ, рд╕рд░реНрд╡рд░ рдХрд╛ рдмрд╛рджрд▓ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдореБрдЭрд╕реЗ рд╕рд░реНрд╡рд░ рддрдХрд░реАрдмрди рдбреЗрдврд╝ рд╣рдЬрд╛рд░ рдХрд┐рд▓реЛрдореАрдЯрд░ред
рдХрд┐рд╕реА рднреА рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдЖрдк рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдиреНрдпреВрдирддрдо 90 рдСрдкрд░реЗрд╢рди рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдкрд░реНрдпрд╛рдкреНрдд рд╕реЗ рдЕрдзрд┐рдХ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣реИрдмрд░ рдХреЗ рдкрд╛рд╕ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдФрд╕рддрди 30 рд╡рд┐рдЪрд╛рд░ рд╣реИрдВ (рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рджреЛрдкрд╣рд░ рдореЗрдВ рдордЬрдмреВрдд рдЪреЛрдЯрд┐рдпреЛрдВ, рд▓реЗрдХрд┐рди рдЧреНрд░реИрдм рд╕реЗ рдкрд╣рд▓реЗ рднреА рдмрдврд╝рддреЗ рдФрд░ рдмрдврд╝рддреЗ рд╣реИрдВ)ред

рднрд╡рд┐рд╖реНрдп рдореЗрдВ, рдПрд╕рдПрд╕рдбреА рдФрд░ рдПрдЪрдбреАрдбреА рдХреЗ рд▓рд┐рдП рд╕рдВрдХреЗрддрдХ рд╕реНрдерд╛рдиреАрдп рдкрд░реАрдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рд▓рд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдФрд░ рд╕рд░реНрд╡рд░ рдХреЗ рд▓рд┐рдП - рдПрдХ рджреВрд░рд╕реНрде рдорд╢реАрди рд╕реЗред
рд╕рд░реНрд╡рд░ рдФрд░ рдПрд╕рдПрд╕рдбреА рдкрд░реАрдХреНрд╖рдг 10 рдереНрд░реЗрдбреНрд╕ рдореЗрдВ 1000 рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдЪрд▓рд╛рдХрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдЪрдбреАрдбреА рдХреЗ рд▓рд┐рдП - 10 рдереНрд░реЗрдбреНрд╕ рдореЗрдВ 100 рдЕрдиреБрд░реЛрдзред

рдЙрд▓рдЭрди


рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛ рджреВрдВ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ 1 рд╕рд░рд▓ INSERT рдЕрдиреБрд░реЛрдз рдерд╛ред рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдПрдХ рд╕реЗрд╡рд╛ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реИ рдЬреЛ рдЖрдзрд╛рд░ рдкрд░ 1 рдСрдкрд░реЗрд╢рди рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд╛рд╕реНрддрд╡рд┐рдХрддрд╛ рд╕реЗ рдмрд╣реБрдд рджреВрд░ рд╣реИред рд╣рдо рддреАрди рдкреНрд░рд╢реНрдиреЛрдВ (1 рдЪрдпрди, 1 рдЕрджреНрдпрддрди рдФрд░ 1 рдЕрдВрдХ) рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░рддреЗ рд╣реИрдВред
рд╕рд╛рд░рд╛рдВрд╢ рд╕рдорд╛рд░реЛрд╣ рдкрд░реАрдХреНрд╖рдг:
  function testIteration($db, $iteration) { $rez = $db->querySingle('SELECT count(*) FROM foo WHERE i='.$iteration); if($rez > 0) { $db->exec('UPDATE foo SET i2 = i2+1 where i='.$iteration); } return $db->exec('INSERT INTO foo VALUES ('.$iteration.', 1)'); } 

рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ SELECT рдХреНрд╡реЗрд░реА рдХреЗ рдмрд┐рдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдкрд░реАрдХреНрд╖рдг рд╣реИ, рдПрдХ рдЕрдиреБрдХреВрд▓рди рдкреНрд░рддрд┐рдпреЛрдЧрд┐рддрд╛ рдирд╣реАрдВ рд╣реИред

рд╕рдВрдХреЗрддрдХ:
SSD: 420 рдЕрдиреБрд░реЛрдзреЛрдВ рд╕реЗред рд░рди рд╕реЗ рд░рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рджрд░ рдЧрд┐рд░рддрд╛ рд╣реИред
HDD: 20 рдЕрдиреБрд░реЛрдзреЛрдВ (рдФрд░ рдХреНрд░реИрд╢) рд╕реЗред
рд╕рд░реНрд╡рд░: 65 рдЕрдиреБрд░реЛрдзреЛрдВ (рдФрд░ рджреБрд░реНрдШрдЯрдирд╛рдУрдВ) рд╕реЗред

DB рдЕрдиреБрдХреВрд▓рди


рдореБрдЭреЗ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдЧрд┐рд░рд╛рд╡рдЯ рдкрд╕рдВрдж рдирд╣реАрдВ рдереАред рдареАрдХ рд╣реИ, рдЪрд▓реЛ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ, рд╣рдо рд╕реВрдЪрдХрд╛рдВрдХ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рд╣рдо рдХреЗрд╡рд▓ рдПрдХ рдлрд╝реАрд▓реНрдб рдЦреЛрдЬрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдЗрдВрдбреЗрдХреНрд╕ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред

рдЖрд░рдВрднреАрдХрд░рдг рдореЗрдВ, рд░реЗрдЦрд╛ рдЬреЛрдбрд╝реЗрдВ
 $db->exec('CREATE INDEX "idx_foo" ON "foo" ("i");'); 

рдкрд░рд┐рдгрд╛рдо:
SSD: 671 рдЕрдиреБрд░реЛрдзред рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ред
HDD: 25 рд╕реЗ 12 рдЕрдиреБрд░реЛрдзреЛрдВ рд╕реЗред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рд╕рдорд╕реНрдпрд╛ рдХреНрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд░рд┐рдгрд╛рдо рд╕рд╛рдВрдХреЗрддрд┐рдХ рдирд╣реАрдВ рд╣реИред рд╢рд╛рдпрдж рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рдХрд┐ рд╕рд░реНрд╡рд░ рдФрд░ рдПрд╕рдПрд╕рдбреА I 10 рдереНрд░реЗрдбреНрд╕ рдореЗрдВ 1000 рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдПрдЪрдбреАрдбреА - 10 рдереНрд░реЗрдбреНрд╕ рдореЗрдВ 100 рдЕрдиреБрд░реЛрдзред рдкрд░рд┐рдорд╛рдг рдХреЗ рдПрдХ рдХреНрд░рдо рд╕реЗ рдХрдо рдбреЗрдЯрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕ рддрд░рд╣ рдХреЗ рдкреНрд░рд╕рд╛рд░ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдерд╛ред
рд╕рд░реНрд╡рд░: 60 рдЕрдиреБрд░реЛрдзред

рдЦреИрд░, рдкрд░рд┐рдгрд╛рдо рдореБрдЭреЗ рдХрд╛рдлреА рднрд╛рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 2 рдЖрдзрд╛рд░ рдкрд░рд┐рд╡рд░реНрддрди рдкрд░рд┐рдЪрд╛рд▓рди рд╣реИрдВ, рдореЗрд░рд╛ рд▓реЗрдирджреЗрди рдХрд╣рд╛рдВ рд╣реИ? рдЗрд╕реЗ рдЬреЛрдбрд╝реЗрдВ:
  function testIteration($db, $iteration) { $rez = $db->querySingle('SELECT count(*) FROM foo WHERE i='.$iteration); $db->exec('BEGIN;'); if($rez > 0) { $db->exec('UPDATE foo SET i2 = i2+1 where i='.$iteration); } $rez = $db->exec('INSERT INTO foo VALUES ('.$iteration.', 1)'); $db->exec('COMMIT;'); return $rez; } 

рдФрд░ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рдгрд╛рдо:
SSD: 720 рдЕрдиреБрд░реЛрдзреЛрдВ рд╕реЗред
HDD: 30 рдЕрдиреБрд░реЛрдзреЛрдВ рд╕реЗред рдФрд░ рдЗрд╕ рдмрд╛рд░ рд╕реВрдЪрдХ рдХрд╛рдлреА рд╕реНрдерд┐рд░ рд╣реИред
рд╕рд░реНрд╡рд░: 70 рдЕрдиреБрд░реЛрдзреЛрдВ рд╕реЗред

рдбреЗрдЯрд╛рдмреЗрд╕ рд╡рд┐рдлрд▓рддрд╛ рдЕрдиреБрдХреВрд▓рди


рдЕрдкрд╛рдЪреЗ рдмреЗрдВрдЪрдорд╛рд░реНрдХ, рдХреНрд╡реЗрд░реА рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рд╕рдлрд▓рддрд╛ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рддрд╛ рд╣реИред рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рд▓рдВрдмрд╛рдИ рд▓реА рдЧрдИ рд╣реИ рдФрд░ рд╕рднреА рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЛ рдореВрд▓ рд╕реЗ рдЕрдзрд┐рдХ рдпрд╛ рдХрдо рддреНрд░реБрдЯрд┐рдпреЛрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ рдХрд┐ рдЬрдм рдЗрд╕реА рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рд▓рдВрдмреЗ рд╕рдордп рддрдХ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд▓рдЧрд╛ред рдкреНрд░рддрд┐ 1000 рдЕрдиреБрд░реЛрдзреЛрдВ рдкрд░ рдХреЗрд╡рд▓ рдПрдХ рджрд░реНрдЬрди рджреЗрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреАред
рд▓реЙрдЧ рдореЗрдВ, рд╕рдВрджреЗрд╢ "SQLite3 :: рдирд┐рд╖реНрдкрд╛рджрди (): рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдВрдж рд╣реИ"ред рдЕрдЬреАрдм рдмрд╛рдд рд╣реИ, рд╡рд╛рд▓ рдореЛрдб, рд▓реЗрдирджреЗрди, рдФрд░ рдЕрднреА рднреА "рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдВрдж рд╣реИ"ред рд╕рдорд╛рдзрд╛рди SQLite рдореЗрд▓рд┐рдВрдЧ рд╕реВрдЪреА рдореЗрдВ рдкрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛: http://www.mail-archive.com/sqlite-users@sqlite.org/msg05525.html
рдорд▓реНрдЯреАрдереНрд░реЗрдбреЗрдб рдореЛрдб рдореЗрдВ, рдЖрдкрдХреЛ "BEGIN" рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ "BEGIN IMMEDIATE" рдпрд╛ "BEGIN EXCLUSIVE" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рд▓реЗрдирджреЗрдиред "BEGIN EXCLUSIVE" рдореЛрдб рдиреЗ рдореБрдЭреЗ рдХрднреА-рдХрднреА рдпрд╣ рд╕рдорд╕реНрдпрд╛ рджреА, рд▓реЗрдХрд┐рди "BEGIN IMMEDIATE" рдореЛрдб рдиреЗ рдЗрд╕реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╣рд▓ рдХрд░ рджрд┐рдпрд╛ред

рдФрд░ рдЕрдм рдЕрдВрддрд┐рдо рдкрд░реАрдХреНрд╖рдг:
SSD: 700 рдЕрдиреБрд░реЛрдзреЛрдВ рд╕реЗред
HDD: 30 рдЕрдиреБрд░реЛрдзреЛрдВ рд╕реЗред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реВрдЪрдХ рдХрд╛рдлреА рд╕реНрдерд┐рд░ рд╣реИред
рд╕рд░реНрд╡рд░: 53 рдЕрдиреБрд░реЛрдзреЛрдВ рд╕реЗред рдЕрдЬреАрдм рдмрд╛рдд рд╣реИ, рдореБрдЭреЗ рд▓рдЧрднрдЧ 70 рдХреА рдЙрдореНрдореАрдж рдереАред рд▓реЗрдХрд┐рди рдпрд╣ рдПрдХ рдмрд╛рджрд▓ рд╣реИ, рд╣рдо рд╕реНрдерд┐рд░рддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред

рд╡реИрд╕реЗ, рд╕рдордп рдХреЗ рд╕рд╛рде рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рд╕рдВрдХреЗрддрдХ рдереЛрдбрд╝рд╛ рдХрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд╕реНрд╡рдЪреНрдЫ рдЖрдзрд╛рд░ рдкрд░, SSD 1000 рдЕрдиреБрд░реЛрдз рдЬрд╛рд░реА рдХрд░рддрд╛ рд╣реИред "рдЧрдВрджреЗ" рдкрд░ - 350 рддрдХред рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ, рд▓рдЧрднрдЧ 50,000 рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдБ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЬрдорд╛ рд╣реЛ рдЧрдИ рд╣реИрдВред

рдпрд╣ рдЬреЛрдбрд╝рдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдпрджрд┐ рдПрдХрд▓-рдереНрд░реЗрдбреЗрдб рдкрд░реАрдХреНрд╖рдг рдЬрдЯрд┐рд▓ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдмрд╣реБ-рдереНрд░реЗрдбреЗрдб (1 рдЪрдпрди, 1 рдЕрджреНрдпрддрди рдФрд░ 1 INSERT рдХреНрд╡реЗрд░реА + рд▓реЗрдирджреЗрди + рдЕрдиреБрдХреНрд░рдорд┐рдд) рдХреЛ рдЬрдЯрд┐рд▓ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рдкрд░рд┐рдгрд╛рдо рдПрд╕рдПрд╕рдбреА рдкрд░ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 1,500 рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рд╣реИред рдЬрд╣рд╛рдВ рдкреНрд░рдпрд╛рд╕ рдХрд░рдирд╛ рд╣реИред рдЙрд╕реА рд╕рдордп, рдЬреИрд╕реЗ-рдЬреИрд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдмрдврд╝рддрд╛ рд╣реИ, рдкреНрд░рджрд░реНрд╢рди рдмрд╣реБ рдереНрд░реЗрдбреЗрдб рдореЛрдб рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд▓рдЧрднрдЧ 2 рдЧреБрдирд╛ рдзреАрдорд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рдмрд╛рд░-рдмрд╛рд░ рдХрд┐рдП рдЧрдП рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдорд▓реНрдЯреА-рдереНрд░реЗрдбреЗрдб рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ SQLite рдХреЗ рдПрдХрд▓-рдереНрд░реЗрдбреЗрдб рдореЛрдб рдХреЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд▓рд╛рднреЛрдВ рдХрд╛ рдкрддрд╛ рдирд╣реАрдВ рдЪрд▓рд╛ред

рд╕рд┐рджреНрдзрд╛рдВрдд рд░реВрдк рдореЗрдВ, рдкрд░реАрдХреНрд╖рдг рдиреЗ рдХрд╛рдлреА рдЕрдЪреНрдЫреЗ рдкрд░рд┐рдгрд╛рдо рджрд┐рдЦрд╛рдПред рдЗрд╕реЗ рд╕реНрдерд╛рдиреЛрдВ рдФрд░ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕реА, рд╡рд┐рд╡рд╛рджрд╛рд╕реНрдкрдж рдФрд░ рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рд╕реАрдЦрд╛ рдирд╣реАрдВ рдЬрд╛рдиреЗ рджреЗрдВред рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, рдореЗрд░реЗ рд▓рд┐рдП рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, SQLite рдФрд░ PHP рдХреЗ рдПрдХ рдЧреБрдЪреНрдЫрд╛ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдореВрд▓реНрдпрд╛рдВрдХрди рдХрд╛рдлреА рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЕрдиреНрдп DBMS рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛


SQLite рд╣рдордиреЗ рджреЗрдЦрд╛ред рд▓реЗрдХрд┐рди рдЕрдиреНрдп DBMS рдЗрди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддреЗ рд╣реИрдВ?
рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдХреЗрд╡рд▓ рд╕реНрдерд╛рдиреАрдп рдорд╢реАрди рдкрд░ рдФрд░ рдХреЗрд╡рд▓ рдПрд╕рдПрд╕рдбреА рдкрд░ рд╣реЛрдЧрд╛ред рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рд╕реНрдерд╛рдиреАрдп рдорд╢реАрди рдкрд░ рд╕рд░реНрд╡рд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ DBMS рд╣реИ, рдФрд░ рдпрд╣ рдореЛрдб рдореЗрд░реЗ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдХрд░реАрдм рд╣реИред
рд╣рд╛рде рдореЗрдВ рдереЗ: SQLite (v3.7.7.1), PostgreSQL (v9.2.1), MS SQL рд╕рд░реНрд╡рд░ (v11.0.3000.0 (2012, рдбреЗрд╡рд▓рдкрд░ рд╕рдВрд╕реНрдХрд░рдг)), MySQL (v5.5.28), MongoDB (v2.4.4) ред
PHP рдиреЗ SQLite рдФрд░ MongoDB рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдбреНрд░рд╛рдЗрд╡рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред PostgreSQL, MySQL рдФрд░ MS SQL рдиреЗ PDO рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ред
рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдореИрдВрдиреЗ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдереЛрдбрд╝рд╛ рдмрджрд▓рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛: 10 рдереНрд░реЗрдбреНрд╕ рдореЗрдВ 10,000 рдЕрдиреБрд░реЛрдз рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдкреНрд░рдпреЛрдЧ рдХреА рд╢реБрджреНрдзрддрд╛ рдХреЗ рд▓рд┐рдП, рдЖрдзрд╛рд░ рд╣рд░ рдмрд╛рд░ рдЦрд╛рд▓реА рдерд╛ред
рдбреЗрдЯрд╛рдмреЗрд╕ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдореИрдиреБрдЕрд▓ рдореЛрдб рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝реЗрд╢рди рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ: рдлрд╝реАрд▓реНрдб рджреНрд╡рд╛рд░рд╛ рддрд╛рд▓рд┐рдХрд╛ рдФрд░ рдЗрдВрдбреЗрдХреНрд╕ рдмрдирд╛рдирд╛ред
SQLite рдХреЗ рд▓рд┐рдП рдЕрдВрддрд┐рдо рд╕реНрдХреНрд░рд┐рдкреНрдЯ
 <?php function openDB() { //     $file = "_TEMP.db"; //   ( ) $db = new SQLite3($file); //   $db->busyTimeout(5000); $db->exec('PRAGMA journal_mode=WAL;'); return $db; } //   function initDB() { $db = openDB(); //   $db->exec('CREATE TABLE foo (i INT, i2 INT)'); $db->exec('CREATE INDEX "idx_foo" ON "foo" ("i");'); return $db; } //    function testDB($db, $count) { return testIteration($db, mt_rand(0, 1000)); } // 1   function testIteration($db, $iteration) { $rez = $db->querySingle('SELECT count(*) FROM foo WHERE i='.$iteration); $db->exec('BEGIN IMMEDIATE;'); if($rez > 0) { $db->exec('UPDATE foo SET i2 = i2+1 where i='.$iteration); } $rez = $db->exec('INSERT INTO foo VALUES ('.$iteration.', 1)'); $db->exec('COMMIT;'); return $rez; } // ----------     ---------- //   if(isset($_REQUEST['init'])) $db = initDB(); else $db = openDB(); if(testDB($db, 1)) echo 'OK'; else echo 'FAIL'; ?> 

рдкреАрдбреАрдУ рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ (PostgreSQL рдХреЗ рд▓рд┐рдП рдХрдиреЗрдХреНрд╢рди рд╕реНрдЯреНрд░рд┐рдВрдЧ, MySQL рдФрд░ MS SQL рдмрджрд▓ рд░рд╣рд╛ рд╣реИ)
 <?php function openDB() { // MySQL $db = new PDO('mysql:host=127.0.0.1;dbname=test', 'root', ''); // PosgreSQL //$db = new PDO("pgsql:host=127.0.0.1;dbname=test", "postgres", "" ); // MS SQL //$db = new PDO("sqlsrv:Database=test;Server=127.0.0.1\SQL2012", "sa", "" ); return $db; } //    function testDB($db, $count) { return testIteration($db, mt_rand(0, 1000)); } // 1   function testIteration($db, $iteration) { $rez = $db->query('SELECT count(*) FROM foo WHERE i='.$iteration); $rez2 = $rez->fetchAll(); $rez2 = $rez2[0][0]; $rez->closeCursor(); if(!$db->beginTransaction()) return false; if($rez2 > 0) { $db->exec('UPDATE foo SET i2 = i2+1 where i='.$iteration); } $rez = $db->exec('INSERT INTO foo VALUES ('.$iteration.', 1)'); $db->commit(); return $rez; } // ----------     ---------- //   $db = openDB(); if(testDB($db, 1)) echo 'OK'; else echo 'FAIL'; ?> 

MongoDB рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ
 <?php function openDB() { $conn = new Mongo('localhost'); $db = $conn->test; return $db; } //    function testDB($db, $count) { return testIteration($db, mt_rand(0, 1000)); } // 1   function testIteration($db, $iteration) { $foo = $db->foo; $q = array('i' => $iteration); $ch = $foo->find($q); if($ch->count() > 0) { $foo->update(array('i' => $iteration), array('$inc' => array("i2" => 1))); } $rez = $foo->insert(array('i' => $iteration, 'i2' => 1)); return $rez; } // ----------     ---------- //   $db = openDB(); if(testDB($db, 1)) echo 'OK'; else echo 'FAIL'; ?> 

рдкрд░рд┐рдгрд╛рдо:
SQLite: рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 993 рдкреНрд░рд╢реНрдиред рдпрд╣ рдЕрдкреЗрдХреНрд╖рд┐рдд рдкрд░рд┐рдгрд╛рдо рд╣реИред
PostgreSQL: рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 178,202 рдкреНрд░рд╢реНрдиред рдмрд╣реБрдд рдХрдоред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рд╕рдорд╕реНрдпрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯрд┐рдВрдЧ рдореЗрдВ рд╣реИред
MS SQL: рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 1400 рдХреНрд╡реЗрд░реАрдЬрд╝ред рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реИ, рдмрд╣реБрдд рдмреБрд░рд╛ рд╣реИред
MySQL: рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 1490 рдкреНрд░рд╢реНрдиред рдпрд╣рд╛рдВ рдЖрдкрдХреЗ рдкрд╛рд╕ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ :) рд╣реИрдВред рдпрд╣ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рд╢реБрд░реВ рдореЗрдВ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 9 рдЕрдиреБрд░реЛрдз рдереЗред 127.0.0.1 рдХреЗ рд╕рд╛рде рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯ рдХреЛ рдХреЙрд▓ рдХреЛ рдмрджрд▓рдиреЗ рдореЗрдВ рдорджрдж рдорд┐рд▓реАред рдЬрд╣рд╛рдВ рддрдХ тАЛтАЛрдореБрдЭреЗ рдкрддрд╛ рд╣реИ, рдпрд╣ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд╕рдХреНрд░рд┐рдп рдЖрдИрдкреАрд╡реА 6 рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИред
MongoDB: рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 3173 рдкреНрд░рд╢реНрдиред рд╢рд╛рдирджрд╛рд░ рдкрд░рд┐рдгрд╛рдоред рд╣рд╛рд▓рд╛рдБрдХрд┐ рдореБрдЭреЗ NoSQL рд╕реЗ рдЬреНрдпрд╛рджрд╛ рдЙрдореНрдореАрдж рдереАред

рд╕рдЪ рдХрд╣реВрдБ рддреЛ, рддреБрд▓рдирд╛ рд╕рдмрд╕реЗ рдИрдорд╛рдирджрд╛рд░ рдирд╣реАрдВ рд╣реИред рдкрд░реАрдХреНрд╖рдг рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкрд░ рд╣реБрдЖред рдореЗрд░реЗ рдкрд╛рд╕ DBMS рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдкреНрд░рд╢рд╛рд╕рдирд┐рдХ рдХреМрд╢рд▓ рдирд╣реАрдВ рд╣реИред
MongoDB рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЧрддрд┐ рдЙрдиреНрдореБрдЦ рд╣реИред SQLIte рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИред рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ PostgeSQL рдиреНрдпреВрдирддрдо рд╕рдВрд╕рд╛рдзрди рдЦрдкрдд рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИред рд╢рд╛рдпрдж рдпрд╣реА рдЕрд╕рдлрд▓рддрд╛ рдХрд╛ рдХрд╛рд░рдг рд╣реИред

UPD: рдЙрдиреНрд╣реЛрдВрдиреЗ рдореБрдЭреЗ рдПрдХ "рдмрдбрд╝реЗ рд░рд╣рд╕реНрдп" рдореЗрдВ рдмрддрд╛рдпрд╛ рдХрд┐ PostgreSQL рдХреЛ рдлрд┐рд░ рд╕реЗ рдЬреЛрдбрд╝рдирд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдкреНрд░рддреНрдпреЗрдХ DBMS рдХреЗ рд▓рд┐рдП рдПрдХрд▓-рдереНрд░реЗрдбреЗрдб рдкрд░реАрдХреНрд╖рдг рдХрд┐рдПред
рдкрд░реАрдХреНрд╖рдг рдПрдХрд▓-рдкреНрд░реЗрд╕ рдореЛрдб рдореЗрдВ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рдордп рдХреЛ рдорд╛рдкрддрд╛ рд╣реИред 10,000 рдСрдкрд░реЗрд╢рди, рдПрдХ рд╕реНрд╡рдЪреНрдЫ рдбреЗрдЯрд╛рдмреЗрд╕ред рд▓реЗрди-рджреЗрди рдореЗрдВ рдкреНрд░рдкрддреНрд░ 1 рдХрд╛ рдЪрдпрди, 1 рдЕрджреНрдпрддрди рдФрд░ 1 INSERT рдХрд╛ рд╕рдВрдЪрд╛рд▓рдиред рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдЬреБрдбрд╝реЗ рдмрд┐рдирд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рдЧрддрд┐ рдХрд╛ рдорд╛рдкрди (рдкрд╣рд▓реА рдкрд░реАрдХреНрд╖рд╛ рдореЗрдВ)ред
рдкрд░рд┐рдгрд╛рдо рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ:
PostgreSQL: 1403. рд╡рд┐рдХрд╛рд╕ 7 рдмрд╛рд░ред рдпрд╣ рдкреБрди: рдХрдиреЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП PostgreSQL рдХреЗ рдирд╛рдкрд╕рдВрдж рд╣реЛрдиреЗ рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рддрд╛ рд╣реИред
PostgreSQL (fsync = off): 1766. рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдореЛрдб рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдПрдХ рдЪреМрдерд╛рдИ рдХреА рд╡реГрджреНрдзрд┐ред рдорд▓реНрдЯреАрдереНрд░реЗрдбреЗрдб рдореЛрдб рдореЗрдВ, рд╡реГрджреНрдзрд┐ рджрд┐рдЦрд╛рдИ рдирд╣реАрдВ рджреАред
SQLite: 938. рдЕрдЬреАрдм, 1500 рд╕реЗ рдкрд╣рд▓реЗ рдерд╛ред рдЯреЗрд╕реНрдЯ рдореЗрдВ рд╢рд╛рдпрдж рдХреЛрдИ рдЧрд▓рддреА рдереАред
MS SQL: 1993. рд╡рд┐рдХрд╛рд╕ рд╣реИ, рд▓реЗрдХрд┐рди рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ рд╣реИред рдХрд╣реАрдВ 40% (1.4 рдЧреБрдирд╛ рд╡реГрджреНрдзрд┐)ред
MySQL: 2514. рд╡рд┐рдХрд╛рд╕, 1.7 рдЧреБрдирд╛ рд╣реИред
MongoDB: 7603. рд╡реГрджреНрдзрд┐ рд▓рдЧрднрдЧ 2.5 рдЧреБрдирд╛ рд╣реИред


рдкрд░рд┐рдгрд╛рдо рдХрд╛рдлреА рджрд┐рд▓рдЪрд╕реНрдк рд╣реИрдВред рдЗрддрдирд╛ рд╣реА рдореИрдВрдиреЗ рд╕рд░реНрд╡рд░ рдкрд░ рд╡рд┐рднрд┐рдиреНрди DBMS рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреА рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред рдЖрдкрдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реВрдВ рдХрд┐ рдбреЗрдмрд┐рдпрди 6 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рд░реНрд╡рд░ рдореЗрдВ: SQLite (v3.7.3), PostgreSQL (v9.0.4), MySQL (v5.1.66) рд╣реИред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯрд┐рдВрдЧ рдореЗрдВ рд╕рдм рдХреБрдЫ рд╣реИред AB рд╕рд░реНрд╡рд░ рдкрд░ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рд╢реБрд░реВ рд╣реБрдЖред 10 рдзрд╛рдЧреЗ рдореЗрдВ 10,000 рдЕрдиреБрд░реЛрдзред
рдкрд░рд┐рдгрд╛рдо:
SQLite: 174 рдХреНрд╡реЗрд░реА рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдбред
PostgreSQL: рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 104 рдкреНрд░рд╢реНрдиред
MySQL: 167 рдХреНрд╡реЗрд░реА рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдбред

рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕реНрдерд╛рдиреАрдп рдорд╢реАрди рдХреЗ рд▓рд┐рдП рдЗрддрдирд╛ рдмрдбрд╝рд╛ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рд╕рд░реНрд╡рд░ рдПрд╕рдПрд╕рдбреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ (рдпрджреНрдпрдкрд┐ "рд╢реБрджреНрдз" рд░реВрдк рдореЗрдВ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдХреНрд▓рд╛рдЙрдб рд╕реНрдЯреЛрд░реЗрдЬ рдХреЗ рддрддреНрд╡ рдХреЗ рд░реВрдк рдореЗрдВ)ред

рдкрд░рд┐рдгрд╛рдо


рдирддреАрдЬрддрди, рд╣рдо рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд▓реЛ-рд▓реЛрдбреЗрдб рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП PHP рдФрд░ SQLite рдХрд╛ рд╕рдВрдпреЛрдЬрди рдХрд╛рдлреА рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╣реИред рдпрд╣ рдХреБрдЫ рд╕рд░рд▓ рдирд┐рдпрдореЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ:
  1. рд╣рдо рд╡рд╛рд▓-рд▓реЙрдЧрд┐рдВрдЧ рдореЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
  2. рд╡реНрдпрд╕реНрдд Timeout рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛ред
  3. рд░рд┐рдХреЙрд░реНрдб рдПрдХ рд▓реЗрдирджреЗрди рдореЗрдВ рд╕рдВрдпреБрдХреНрдд рд╣реИред рдФрд░ рд╕рд░рд▓ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди "BEGIN IMMEDIATE"ред

рдпрджрд┐ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ "рдЫреЛрдЯреЗ" рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдирд╣реАрдВ рдард╣рд░рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд▓рд┐рдП рдПрд╕рдПрд╕рдбреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдпрд╣рд╛рдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдорджрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдЕрдЧрд░ рд╣рдо рд╣рд╛рдп-рд▓реЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓реЛрдЧ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдореЗрд░реА рд╕рд▓рд╛рд╣ рдХреЗ рдмрд┐рдирд╛ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИред

рдпрджрд┐ рдЖрдк рдЕрдиреНрдп DBMS рдХреЗ рд╕рд╛рде SQLite рдХреА рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдкрд░ рддреБрд▓рдиреАрдп рдкреНрд░рджрд░реНрд╢рди рдХрд░рддреЗ рд╣реИрдВред рд╡реИрд╕реЗ рднреА, SSD рдбреНрд░рд╛рдЗрд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордпред
рдЗрд╕реА рд╕рдордп, рд╕реЗрдЯрдЕрдк рдореЗрдВ рдЖрд╕рд╛рдиреА рдФрд░ рдкреНрд░рд╢рд╛рд╕рди (рдХреБрдЫ рднреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдФрд░ рдкреНрд░рд╢рд╛рд╕рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ), рджреВрд╕рд░реЗ рд╕рд░реНрд╡рд░ рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рдг рдореЗрдВ рдЖрд╕рд╛рдиреА (рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рдХреЗ рд╕рд╛рде) SQLite рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд▓рд╛рдн рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИред рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдПред PHP рдХреЗ рд╕рд╛рде SQLite рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рднреА рдирд╣реАрдВ, рд▓реЗрдХрд┐рди PHP рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

Source: https://habr.com/ru/post/In204438/


All Articles