Apakah mysqli lebih cepat dari pdo?

Selamat datang di tutorial singkat tentang perbedaan antara MySQL, MySQLi, dan PDO di PHP. Jadi Anda mungkin baru saja mulai bekerja dengan MySQL di PHP, dan memperhatikan bahwa ada 3 ekstensi berbeda untuk bekerja dengan database

Perbedaan utama antara ekstensi MySQL, MySQLi, dan PDO adalah

  • MySQL – Ekstensi PHP-MySQL awal, saat ini mati dan dihapus
  • MySQLi (MySQL Improved) – Versi perbaikan dari ekstensi MySQL sebelumnya
  • Objek Data PHP (PDO) – Ekstensi basis data modern. Mendukung tidak hanya MySQL, tetapi juga database lain seperti Firebird, SQLite, Postgre, dan lainnya

Ya, yang disebut “perbedaan” sebenarnya adalah riwayat pengembangan ekstensi MySQL di PHP itu sendiri. Tapi mana yang benar, mana yang "lebih baik", dan mana yang harus Anda gunakan?

ⓘ Saya telah menyertakan file zip dengan semua kode sumber di awal tutorial ini, jadi Anda tidak perlu menyalin-tempel semuanya… Atau jika Anda hanya ingin langsung masuk

 

 

DAFTAR ISI

 

UNDUH & CATATAN

Pertama, berikut adalah tautan unduhan ke contoh kode sumber seperti yang dijanjikan

 

CATATAN CEPAT

  • Harap pastikan bahwa masing-masing extension=mysql, extension=mysqli, atau extension=pdo_mysql diaktifkan di php.ini
  • Buat basis data pengujian dan impor 0-dummy.sql
  • 1-mysql.php
    <?php
    // (TEST) START TIME
    $taken = microtime(true);
     
    // (A) DATABASE SETTINGS - CHANGE THESE TO YOUR OWN!
    define("DB_HOST", "localhost");
    define("DB_NAME", "test");
    define("DB_CHARSET", "utf8");
    define("DB_USER", "root");
    define("DB_PASSWORD", "");
    
    // (B) DATABASE CONNECTION
    $mysql = new mysql(DB_HOST, DB_USER, DB_PASSWORD);
    if (!$mysql) { exit(mysql_error()); }
    mysql_select_db(DB_NAME, $mysql);
    mysql_set_charset(DB_CHARSET, $mysql);
    
    // (C) SELECT USERS
    $result = mysql_query("SELECT * FROM `users`");
    while ($row = mysql_fetch_array($result, MYSQL_NUM)) { print_r($row); }
    mysql_free_result($result);
    mysql_close($mysql);
    
    // (TEST) TOTAL TIME TAKEN
    $taken = microtime(true) - $taken;
    echo "Total time taken $taken";
    
    0, dan
    <?php
    // (TEST) START TIME
    $taken = microtime(true);
     
    // (A) DATABASE SETTINGS - CHANGE THESE TO YOUR OWN!
    define("DB_HOST", "localhost");
    define("DB_NAME", "test");
    define("DB_CHARSET", "utf8");
    define("DB_USER", "root");
    define("DB_PASSWORD", "");
    
    // (B) DATABASE CONNECTION
    $mysql = new mysql(DB_HOST, DB_USER, DB_PASSWORD);
    if (!$mysql) { exit(mysql_error()); }
    mysql_select_db(DB_NAME, $mysql);
    mysql_set_charset(DB_CHARSET, $mysql);
    
    // (C) SELECT USERS
    $result = mysql_query("SELECT * FROM `users`");
    while ($row = mysql_fetch_array($result, MYSQL_NUM)) { print_r($row); }
    mysql_free_result($result);
    mysql_close($mysql);
    
    // (TEST) TOTAL TIME TAKEN
    $taken = microtime(true) - $taken;
    echo "Total time taken $taken";
    
    1 akan menunjukkan masing-masing contoh dari setiap ekstensi. Ingatlah untuk mengubah pengaturan basis data di skrip
Jika Anda menemukan bug, jangan ragu untuk berkomentar di bawah ini. Saya mencoba menjawab pertanyaan singkat juga, tetapi itu adalah satu orang versus seluruh dunia… Jika Anda sangat membutuhkan jawaban, silakan periksa daftar situs web saya untuk mendapatkan bantuan dalam pemrograman

 

DOWNLOAD KODE CONTOH

Klik di sini untuk mengunduh kode sumber, saya telah merilisnya di bawah lisensi MIT, jadi silakan membangun di atasnya atau menggunakannya dalam proyek Anda sendiri

 

 

EKSTENSI PHP MYSQL

Baiklah, sekarang mari kita masuk ke contoh penggunaan setiap ekstensi database MySQL. Juga, tes "non-profesional non-ilmiah" sederhana untuk melihat mana yang berkinerja terbaik

 

PRELUDE) DATABASE DUMMY

0-boneka. sql

-- (A) USERS TABLE
CREATE TABLE `users` (
  `id` bigint(20) NOT NULL,
  `name` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
 
ALTER TABLE `users`
  ADD PRIMARY KEY (`id`);
 
ALTER TABLE `users`
  MODIFY `id` bigint(20) NOT NULL AUTO_INCREMENT;
 
-- (B) DUMMY USERS
INSERT INTO `users` (`id`, `name`) VALUES
(1, 'Bevis'),
(2, 'Cally'),
(3, 'Harrison'),
...

Jika Anda tertarik untuk menjalankan “non-conclusive performance test”, berikut tabel dummy yang kami gunakan, unduh file zip di atas

 

BAGIAN 1) EKSTENSI MYSQL LEGACY

1-mysql. php

<?php
// (TEST) START TIME
$taken = microtime(true);
 
// (A) DATABASE SETTINGS - CHANGE THESE TO YOUR OWN!
define("DB_HOST", "localhost");
define("DB_NAME", "test");
define("DB_CHARSET", "utf8");
define("DB_USER", "root");
define("DB_PASSWORD", "");

// (B) DATABASE CONNECTION
$mysql = new mysql(DB_HOST, DB_USER, DB_PASSWORD);
if (!$mysql) { exit(mysql_error()); }
mysql_select_db(DB_NAME, $mysql);
mysql_set_charset(DB_CHARSET, $mysql);

// (C) SELECT USERS
$result = mysql_query("SELECT * FROM `users`");
while ($row = mysql_fetch_array($result, MYSQL_NUM)) { print_r($row); }
mysql_free_result($result);
mysql_close($mysql);

// (TEST) TOTAL TIME TAKEN
$taken = microtime(true) - $taken;
echo "Total time taken $taken";

Sekarang, ekstensi MySQL (asli) telah dihapus total di PHP 7. Karena itu, saya akan meninggalkan ini di sini sebagai contoh bagi orang-orang yang mungkin perlu mendukung sistem lama. Jika tidak, tolong jangan gunakan ekstensi usang ini lagi

 

 

BAGIAN 2) EKSTENSI MYSQLI

2-mysqli. php

<?php
// (TEST) START TIME
$taken = microtime(true);
 
// (A) DATABASE SETTINGS - CHANGE THESE TO YOUR OWN!
define("DB_HOST", "localhost");
define("DB_NAME", "test");
define("DB_CHARSET", "utf8");
define("DB_USER", "root");
define("DB_PASSWORD", "");
 
// (B) ATTEMPT DATABASE CONNECTION
$mysqli = new mysqli(DB_HOST, DB_USER, DB_PASSWORD, DB_NAME);
if ($mysqli->connect_error) { exit($mysqli->connect_error); }
$mysqli->set_charset(DB_CHARSET);
 
// (C) SELECT USERS
$result = $mysqli->query("SELECT * FROM `users`");
while ($row = $result->fetch_assoc()) { print_r($row); }
$result->close();
$mysqli->close();
 
// (TEST) TOTAL TIME TAKEN
$taken = microtime(true) - $taken;
echo "Total time taken $taken";
_

Itu benar, ini hampir sama dengan MySQL tradisional, satu-satunya perbedaan adalah kami menggunakan

<?php
// (TEST) START TIME
$taken = microtime(true);
 
// (A) DATABASE SETTINGS - CHANGE THESE TO YOUR OWN!
define("DB_HOST", "localhost");
define("DB_NAME", "test");
define("DB_CHARSET", "utf8");
define("DB_USER", "root");
define("DB_PASSWORD", "");

// (B) DATABASE CONNECTION
$mysql = new mysql(DB_HOST, DB_USER, DB_PASSWORD);
if (!$mysql) { exit(mysql_error()); }
mysql_select_db(DB_NAME, $mysql);
mysql_set_charset(DB_CHARSET, $mysql);

// (C) SELECT USERS
$result = mysql_query("SELECT * FROM `users`");
while ($row = mysql_fetch_array($result, MYSQL_NUM)) { print_r($row); }
mysql_free_result($result);
mysql_close($mysql);

// (TEST) TOTAL TIME TAKEN
$taken = microtime(true) - $taken;
echo "Total time taken $taken";
2 sebagai gantinya. Untuk penggunaannya, telusuri saja skripnya, sesederhana mungkin

 

 

BAGIAN 3) PERPANJANGAN PDO

3-pdo. php

<?php
// (TEST) START TIME
$taken = microtime(true);
 
// (A) DATABASE SETTINGS - CHANGE THESE TO YOUR OWN!
define("DB_HOST", "localhost");
define("DB_NAME", "test");
define("DB_CHARSET", "utf8");
define("DB_USER", "root");
define("DB_PASSWORD", "");

// (B) ATTEMPT DATABASE CONNECTION
$pdo = new PDO(
  "mysql:host=". DB_HOST .";dbname=". DB_NAME .";charset=". DB_CHARSET,
  DB_USER, DB_PASSWORD, [
  PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
  PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
]);

// (C) SELECT USERS
$stmt = $pdo->prepare("SELECT * FROM `users`");
$stmt->execute();
while ($row = $stmt->fetch()) { print_r($row); }
if ($stmt !== null) { $stmt = null; }
if ($pdo !== null) { $pdo = null; }

// (TEST) TOTAL TIME TAKEN
$taken = microtime(true) - $taken;
echo "Total time taken $taken";
_

Sekarang, contoh PDO ini juga harus sangat mudah. Tetapi keindahan PDO sebenarnya terletak pada kompatibilitasnya dengan berbagai macam database – Artinya, ekstensi ini berfungsi dengan banyak database lain selain MySQL. Selain itu, ada banyak cara cerdas untuk mengambil entri menggunakan PDO –

<?php
// (TEST) START TIME
$taken = microtime(true);
 
// (A) DATABASE SETTINGS - CHANGE THESE TO YOUR OWN!
define("DB_HOST", "localhost");
define("DB_NAME", "test");
define("DB_CHARSET", "utf8");
define("DB_USER", "root");
define("DB_PASSWORD", "");

// (B) DATABASE CONNECTION
$mysql = new mysql(DB_HOST, DB_USER, DB_PASSWORD);
if (!$mysql) { exit(mysql_error()); }
mysql_select_db(DB_NAME, $mysql);
mysql_set_charset(DB_CHARSET, $mysql);

// (C) SELECT USERS
$result = mysql_query("SELECT * FROM `users`");
while ($row = mysql_fetch_array($result, MYSQL_NUM)) { print_r($row); }
mysql_free_result($result);
mysql_close($mysql);

// (TEST) TOTAL TIME TAKEN
$taken = microtime(true) - $taken;
echo "Total time taken $taken";
3,
<?php
// (TEST) START TIME
$taken = microtime(true);
 
// (A) DATABASE SETTINGS - CHANGE THESE TO YOUR OWN!
define("DB_HOST", "localhost");
define("DB_NAME", "test");
define("DB_CHARSET", "utf8");
define("DB_USER", "root");
define("DB_PASSWORD", "");

// (B) DATABASE CONNECTION
$mysql = new mysql(DB_HOST, DB_USER, DB_PASSWORD);
if (!$mysql) { exit(mysql_error()); }
mysql_select_db(DB_NAME, $mysql);
mysql_set_charset(DB_CHARSET, $mysql);

// (C) SELECT USERS
$result = mysql_query("SELECT * FROM `users`");
while ($row = mysql_fetch_array($result, MYSQL_NUM)) { print_r($row); }
mysql_free_result($result);
mysql_close($mysql);

// (TEST) TOTAL TIME TAKEN
$taken = microtime(true) - $taken;
echo "Total time taken $taken";
4,
<?php
// (TEST) START TIME
$taken = microtime(true);
 
// (A) DATABASE SETTINGS - CHANGE THESE TO YOUR OWN!
define("DB_HOST", "localhost");
define("DB_NAME", "test");
define("DB_CHARSET", "utf8");
define("DB_USER", "root");
define("DB_PASSWORD", "");

// (B) DATABASE CONNECTION
$mysql = new mysql(DB_HOST, DB_USER, DB_PASSWORD);
if (!$mysql) { exit(mysql_error()); }
mysql_select_db(DB_NAME, $mysql);
mysql_set_charset(DB_CHARSET, $mysql);

// (C) SELECT USERS
$result = mysql_query("SELECT * FROM `users`");
while ($row = mysql_fetch_array($result, MYSQL_NUM)) { print_r($row); }
mysql_free_result($result);
mysql_close($mysql);

// (TEST) TOTAL TIME TAKEN
$taken = microtime(true) - $taken;
echo "Total time taken $taken";
5, dan bahkan mengatur bagaimana array disusun

 

 

Itu saja untuk panduan ini, dan ini adalah bagian kecil tentang beberapa tambahan dan tautan yang mungkin berguna bagi Anda

 

MANA YANG LEBIH BAIK"?

Untuk pengujian sederhana, saya menjalankan

<?php
// (TEST) START TIME
$taken = microtime(true);
 
// (A) DATABASE SETTINGS - CHANGE THESE TO YOUR OWN!
define("DB_HOST", "localhost");
define("DB_NAME", "test");
define("DB_CHARSET", "utf8");
define("DB_USER", "root");
define("DB_PASSWORD", "");

// (B) DATABASE CONNECTION
$mysql = new mysql(DB_HOST, DB_USER, DB_PASSWORD);
if (!$mysql) { exit(mysql_error()); }
mysql_select_db(DB_NAME, $mysql);
mysql_set_charset(DB_CHARSET, $mysql);

// (C) SELECT USERS
$result = mysql_query("SELECT * FROM `users`");
while ($row = mysql_fetch_array($result, MYSQL_NUM)) { print_r($row); }
mysql_free_result($result);
mysql_close($mysql);

// (TEST) TOTAL TIME TAKEN
$taken = microtime(true) - $taken;
echo "Total time taken $taken";
0 dan
<?php
// (TEST) START TIME
$taken = microtime(true);
 
// (A) DATABASE SETTINGS - CHANGE THESE TO YOUR OWN!
define("DB_HOST", "localhost");
define("DB_NAME", "test");
define("DB_CHARSET", "utf8");
define("DB_USER", "root");
define("DB_PASSWORD", "");

// (B) DATABASE CONNECTION
$mysql = new mysql(DB_HOST, DB_USER, DB_PASSWORD);
if (!$mysql) { exit(mysql_error()); }
mysql_select_db(DB_NAME, $mysql);
mysql_set_charset(DB_CHARSET, $mysql);

// (C) SELECT USERS
$result = mysql_query("SELECT * FROM `users`");
while ($row = mysql_fetch_array($result, MYSQL_NUM)) { print_r($row); }
mysql_free_result($result);
mysql_close($mysql);

// (TEST) TOTAL TIME TAKEN
$taken = microtime(true) - $taken;
echo "Total time taken $taken";
1 di server pengembangan saya, mengambil 100 pengguna 10 kali. Waktu rata-rata adalah sebagai berikut

  • MySQLi – 0. 0096925020217896 detik
  • PDO-0. 015011477470398 detik

Jadi ya, ada perbedaan kinerja sepersekian detik. Saya pribadi tidak akan mempermasalahkannya, tetapi jika Anda menyukai "tes kinerja profesional ilmiah" - Jangan ragu untuk merancang rangkaian tes Anda sendiri (dan beri tahu kami hasilnya)

 

MYSQL, MYSQLI, PDO – MANA YANG HARUS SAYA GUNAKAN?

Saya akan sangat merekomendasikan menggunakan PDO. Hanya karena dukungannya untuk berbagai basis data, dan abstraksi yang disediakannya. Kita hanya perlu mengaktifkan ekstensi PDO masing-masing di php.ini, dan proyek siap bekerja dengan database selain MySQL. Misalnya, “memutakhirkan” dari MySQL ke Oracle Database

 

  • PDO-PHP
  • MySQLi – PHP
  • MySQL-PHP
  • phpMyAdmin – Manajer basis data PHP gratis. Jika Anda menginstal paket XAMPP, itu sudah diinstal di
    <?php
    // (TEST) START TIME
    $taken = microtime(true);
     
    // (A) DATABASE SETTINGS - CHANGE THESE TO YOUR OWN!
    define("DB_HOST", "localhost");
    define("DB_NAME", "test");
    define("DB_CHARSET", "utf8");
    define("DB_USER", "root");
    define("DB_PASSWORD", "");
    
    // (B) DATABASE CONNECTION
    $mysql = new mysql(DB_HOST, DB_USER, DB_PASSWORD);
    if (!$mysql) { exit(mysql_error()); }
    mysql_select_db(DB_NAME, $mysql);
    mysql_set_charset(DB_CHARSET, $mysql);
    
    // (C) SELECT USERS
    $result = mysql_query("SELECT * FROM `users`");
    while ($row = mysql_fetch_array($result, MYSQL_NUM)) { print_r($row); }
    mysql_free_result($result);
    mysql_close($mysql);
    
    // (TEST) TOTAL TIME TAKEN
    $taken = microtime(true) - $taken;
    echo "Total time taken $taken";
    
    9
  • MySQL Workbench – Apa yang disebut manajer database MySQL resmi oleh Oracle sendiri

 

TAMAT

Terima kasih telah membaca, dan kami telah sampai di akhir panduan ini. Saya harap ini membantu Anda dengan proyek Anda, dan jika Anda ingin berbagi apa pun dengan panduan ini, jangan ragu untuk berkomentar di bawah ini. Semoga berhasil dan selamat membuat kode

Mana yang lebih baik MySQLi atau PDO?

Baik MySQLi maupun PDO memiliki kelebihan masing-masing. PDO akan bekerja pada 12 sistem database yang berbeda, sedangkan MySQLi hanya akan bekerja dengan database MySQL . Jadi, jika Anda harus mengalihkan proyek Anda untuk menggunakan database lain, PDO mempermudah prosesnya. Anda hanya perlu mengubah rangkaian koneksi dan beberapa kueri.

Apakah PDO lebih aman daripada MySQLi?

PDO lebih aman daripada dua opsi pertama dan juga lebih cepat dibandingkan dengan MySQLi prosedural dan berorientasi objek MySQLi. PDO adalah lapisan akses basis data yang menyediakan antarmuka yang cepat dan konsisten untuk mengakses dan mengelola basis data dalam aplikasi PHP.

Apakah MySQLi lebih cepat dari MySQL?

Ekstensi MySQL sedikit lebih cepat daripada MySQLi di sebagian besar tolok ukur yang pernah saya lihat dilaporkan. Perbedaannya sangat kecil, bagaimanapun, ini mungkin bukan kriteria Anda untuk memutuskan di antara keduanya. Faktor lain mengerdilkan perbedaan kinerja antara mysql dan mysqli.

Apa perbedaan MySQLi dari PDO?

Seperti yang dinyatakan sebelumnya, PDO dan MySQLi sangat mirip, tetapi ada sedikit perbedaan dalam sintaks. MySQLi mengikuti konvensi snake_case PHP jadul, sementara PDO menggunakan camelCase . Selain itu, metode MySQLi digunakan sebagai properti objek, sedangkan PDO menggunakan sintaks tradisional untuk fungsi.