ทำไมทุกคนถึงบ่นว่า SQLite ทำงานช้า? “ชุด SQL ที่ค่อนข้างสมบูรณ์” หมายความว่าอย่างไร

การแนะนำ

SQLite เป็นฐานข้อมูลเชิงสัมพันธ์ที่สามารถสืบค้นได้โดยใช้ภาษา แบบสอบถาม SQL- ฐานข้อมูลไม่รองรับคุณสมบัติทั้งหมดของ SQL และมีฟังก์ชั่นการทำงานด้อยกว่า DBMS ที่พัฒนาแล้วอื่น ๆ แต่ค่อนข้างเหมาะสำหรับการจัดเก็บและเรียกค้นข้อมูล

ความแตกต่างระหว่าง SQLite และ MySQL และ DBMS ที่คล้ายกัน

DBMS แบบคลาสสิก เช่น MySQL (รวมถึง MS SQL, Oracle, PostgreeSQL) ประกอบด้วย เซิร์ฟเวอร์แยกต่างหากซึ่งสนับสนุนการทำงานของฐานข้อมูลและรับฟังพอร์ตเฉพาะสำหรับคำขอของไคลเอ็นต์ ลูกค้าก็สามารถเป็นได้ ส่วนขยาย PHPซึ่งใช้อินเทอร์เฟซที่ใช้ในการสืบค้นไปยังฐานข้อมูล กลไก SQLite และอินเทอร์เฟซถูกนำไปใช้ในไลบรารีเดียว ซึ่งเพิ่มความเร็วของการดำเนินการค้นหา เซิร์ฟเวอร์นี้มักถูกเรียกว่า ในตัว.

ความคิดเห็น

ฐานข้อมูลอื่นๆ เช่น MySQL ก็มีเซิร์ฟเวอร์ในตัวเช่นกัน แต่การใช้งานต้องเสียค่าธรรมเนียมใบอนุญาต ดังนั้นจึงไม่ค่อยมีการใช้กันอย่างแพร่หลายในโลกโอเพ่นซอร์ส

SQLite เป็นฐานข้อมูลที่ไม่มีประเภท แม่นยำยิ่งขึ้นมีเพียงสองประเภทเท่านั้น - จำนวนเต็ม "จำนวนเต็ม" และข้อความ "ข้อความ" นอกจากนี้ "จำนวนเต็ม" ยังใช้สำหรับ คีย์หลักตารางและข้อมูลที่เหลือ "ข้อความ" จะไป ความยาวของสตริงที่เขียนลงในช่องข้อความสามารถมีความยาวเท่าใดก็ได้

คุณสมบัติของ SQLite

ฐานข้อมูลทั้งหมดจะถูกจัดเก็บไว้ในไฟล์ หนึ่งไฟล์ต่อฐานข้อมูล จำนวนฐานข้อมูลและตารางในนั้นมีจำนวนจำกัดเท่านั้น พื้นที่ว่างมีอยู่บนเว็บไซต์ และขนาดสูงสุดที่เป็นไปได้ของหนึ่งฐานข้อมูลคือ 2 TB

เนื่องจากข้อมูลทั้งหมดถูกจัดเก็บไว้ในไฟล์ จึงไม่มีปัญหาในการถ่ายโอนฐานข้อมูลจากโฮสติ้งหนึ่งไปยังอีกโฮสต์หนึ่ง - คุณเพียงแค่ต้องคัดลอกไฟล์ที่เกี่ยวข้อง

การติดตั้ง SQLite

ใน PHP5 มีการติดตั้งและเปิดใช้งานการสนับสนุน SQLite ตามค่าเริ่มต้น

การติดตั้งภายใต้ Windows:ในการติดตั้ง SQLite คุณต้องดาวน์โหลดและคัดลอกไลบรารี "php_sqlite.dll" ไปยังโฟลเดอร์ส่วนขยายซึ่งสามารถดาวน์โหลดได้จากลิงก์: http://snaps.php.net/win32/PECL_STABLE/php_sqlite.dll จากนั้นคุณจะต้องไม่ใส่เครื่องหมายข้อคิดเห็น (หรือเพิ่ม) บรรทัด "extension=php_sqlite.dll" ในไฟล์ "php.ini" เพื่อให้ SQLite ทำงานได้อย่างถูกต้อง คุณจะต้องยกเลิกการใส่เครื่องหมายบรรทัด "extension=php_pdo.dll" ด้วย

ความคิดเห็น

ความคิดเห็น

ต้องโหลดไลบรารี "php_pdo.dll" ก่อนที่จะโหลด "php_sqlite.dll" นั่นคือใน php.ini บรรทัด "extension=php_sqlite.dll" ควรปรากฏหลัง "extension=php_pdo.dll"

การติดตั้งภายใต้ Unix:ดาวน์โหลด SQLite เวอร์ชันล่าสุดจากเว็บไซต์อย่างเป็นทางการ (http://sqlite.org/download.html) อ่านไฟล์ "INSTALL" ที่มาพร้อมกับการทดสอบโมดูลต้นทาง หรือใช้คำสั่งการติดตั้ง PEAR: "pear install sqlite"

การทำงานกับ SQLite

การสร้างฐานข้อมูล:ในการสร้างฐานข้อมูลใหม่ คุณต้องใช้ฟังก์ชัน sqlite_open() หากไม่มีฐานข้อมูลที่ระบุชื่อในพารามิเตอร์ "ชื่อไฟล์" ฟังก์ชันจะสร้างฐานข้อมูลใหม่ด้วยชื่อ "ชื่อไฟล์" และส่งคืนตัวระบุฐานข้อมูล

ทรัพยากร sqlite_open (ชื่อไฟล์สตริง [, โหมด int [, สตริง &error_message]])

สคริปต์ด้านล่างแสดงให้เห็นถึงการสร้าง ฐานใหม่ข้อมูล:

// สร้างฐานข้อมูล

ถ้า (! $db ) ออก ( "สร้างฐานข้อมูลล้มเหลว!");
?>

ด้วยเหตุนี้ในโฟลเดอร์ที่มีสคริปต์เราจะมีไฟล์ชื่อ "my_database.db" - ฐานข้อมูลของเรา

การสร้างตาราง:การสืบค้นทั้งหมดไปยังฐานข้อมูลดำเนินการโดยฟังก์ชัน sqlite_query() ซึ่งมีรูปแบบดังนี้:

ทรัพยากร sqlite_query (ทรัพยากร dbhandle, แบบสอบถามสตริง)

ความคิดเห็น

เพื่อทำงานกับ SQLite เหมือนกับอย่างอื่น ฐานสัมพันธ์ข้อมูลโดยใช้ภาษาคิวรี SQL ดังนั้น คุณสามารถสร้างตารางข้อมูลโดยใช้แบบสอบถาม CREATE TABLE แบบดั้งเดิม แทรกบันทึกโดยใช้คำสั่ง INSERT และดึงข้อมูลบันทึกโดยใช้ ช่วยเลือกและอัปเดต รายการที่มีอยู่โดยใช้คำขอ UPDATE

ตัวอย่างด้านล่างสร้างตาราง table1 ที่มีสามฟิลด์: ฟิลด์รหัสจำนวนเต็มซึ่งทำหน้าที่เป็นคีย์หลัก และสองฟิลด์ ช่องข้อความฟิลด์ 1 และ ฟิลด์ 2

$db = sqlite_open("my_database.db" );
ถ้า (! $db ) ออก();
“สร้างตาราง table1
(id รหัสหลักจำนวนเต็ม
ข้อความ field1,
ข้อความ field2);
"
);
ถ้า (! $query_table ) ออก();
$query_insert = sqlite_query ($db, "แทรกลงใน table1(field1, field2) ค่า ("PHP5", "Apache");");
ถ้า (! $query_insert ) ออก( "ไม่สามารถเขียนข้อมูลลงตารางได้!");
?>

หลังจากสร้างตารางแล้ว จะมีการเพิ่มบันทึกที่มีบรรทัด "PHP5" และ "Apache" ลงไป ฟิลด์ id จะได้รับค่า 1 โดยอัตโนมัติ

การส่งออกข้อมูลจากฐานข้อมูล:ในการแสดงข้อมูลจากตาราง จะใช้ฟังก์ชันเดียวกัน - sqlite_query() หากดึงข้อมูลหลายระเบียน ผลลัพธ์การดึงข้อมูลควรได้รับการประมวลผลโดยใช้ฟังก์ชัน while() และฟังก์ชัน sqlite_fetch_array() ซึ่งมีไวยากรณ์ดังต่อไปนี้:

อาร์เรย์ sqlite_fetch_array (ผลลัพธ์ทรัพยากร [, int result_type [, bool decode_binary]])

ด้านล่างนี้เป็นสคริปต์ที่แสดงผลลัพธ์ของบันทึกต่างๆ จากฐานข้อมูล:

// สร้างฐานข้อมูลใหม่
$db = sqlite_open("my_database.db" );
ถ้า (! $db ) ออก ( "ไม่สามารถสร้างฐานข้อมูลได้!");
// สร้างตาราง "table1" ในฐานข้อมูล
$query_table = sqlite_query ($db, “สร้างตาราง table1
(id รหัสหลักจำนวนเต็ม
/* id จะเพิ่มขึ้นโดยอัตโนมัติ */
ข้อความ field1,
ข้อความ field2);
"
);
ถ้า (! $query_table ) ออก( "ไม่สามารถสร้างตารางในฐานข้อมูลได้!");
// เขียนอะไรบางอย่างลงบนโต๊ะ
sqlite_query($db, );
sqlite_query($db, );
sqlite_query($db, );
// เรามาสุ่มตัวอย่างข้อมูลกัน
$res = sqlite_query ($db, "SELECT * FROM table1;" );
ในขณะที่ ($array = sqlite_fetch_array ($res))
{

" );
}
?>

จากสคริปต์ที่เราได้รับ:

PHP5+Apache (รหัสรายการ:1)

การแก้ไขโพสต์: หากต้องการเปลี่ยนฟิลด์ เราจะใช้ฟังก์ชัน sqlite_query() และส่งต่อคำขออัปเดต (UPDATE)

// สร้างฐานข้อมูลใหม่
$db = sqlite_open("my_database.db" );
ถ้า (! $db ) ออก ( "ไม่สามารถสร้างฐานข้อมูลได้!");
// สร้างตาราง "table1" ในฐานข้อมูล
$query_table = sqlite_query ($db, “สร้างตาราง table1
(id รหัสหลักจำนวนเต็ม
/* id จะเพิ่มขึ้นโดยอัตโนมัติ */
ข้อความ field1,
ข้อความ field2);
"
);
ถ้า (! $query_table ) ออก( "ไม่สามารถสร้างตารางในฐานข้อมูลได้!");
// เขียนอะไรบางอย่างลงบนโต๊ะ
sqlite_query ($db, "แทรกลงในค่า table1(field1, field2) ("PHP5+", "Apache");");
sqlite_query ($db, "INSERT INTO table1(field1, field2) ค่า ("SQLite - ", "สิ่งที่ยอดเยี่ยม");");
sqlite_query ($db, "แทรกลงในค่า table1(field1, field2) ("เยี่ยมชม ", "sqlite.org");");
// เปลี่ยนฟิลด์ด้วย id=1
sqlite_query ($db, "อัปเดต table1 SET field2 = "Apache + Linux" โดยที่ id = 1;");
// เรามาสุ่มตัวอย่างข้อมูลกัน

// ในวงเราจะแสดงข้อมูลที่ได้รับทั้งหมด

{
echo($array [ "field1" ]. $array [ "field2" ]. " (รหัสรายการ: " . $array [ "id" ]. ")
" );
}
?>

เป็นผลให้เราได้รับ:

PHP5+Apache+Linux (รหัสรายการ:1)
SQLite เป็นสิ่งที่ดี (รหัสโพสต์: 2)
เยี่ยมชม sqlite.org (รหัสโพสต์:3)

การลบบันทึกออกจากตาราง: หากต้องการลบบันทึกออกจากตาราง คุณต้องส่งคำขอลบ (DELETE) ไปยังฟังก์ชัน sqlite_query()

// สร้างฐานข้อมูลใหม่
$db = sqlite_open("my_database.db" );
ถ้า (! $db ) ออก ( "ไม่สามารถสร้างฐานข้อมูลได้!");
// สร้างตาราง "table1" ในฐานข้อมูล
$query_table = sqlite_query ($db, “สร้างตาราง table1
(id รหัสหลักจำนวนเต็ม
/* id จะเพิ่มขึ้นโดยอัตโนมัติ */
ข้อความ field1,
ข้อความ field2);
"
);
ถ้า (! $query_table ) ออก( "ไม่สามารถสร้างตารางในฐานข้อมูลได้!");
// เขียนอะไรบางอย่างลงบนโต๊ะ
sqlite_query ($db, "แทรกลงในค่า table1(field1, field2) ("PHP5+", "Apache");");
sqlite_query ($db, "INSERT INTO table1(field1, field2) ค่า ("SQLite - ", "สิ่งที่ยอดเยี่ยม");");
sqlite_query ($db, "แทรกลงในค่า table1(field1, field2) ("เยี่ยมชม ", "sqlite.org");");
// ลบฟิลด์ด้วย id=2
sqlite_query ($db, "ลบออกจาก table1 โดยที่ id = 2;");
// เรามาสุ่มตัวอย่างข้อมูลกัน
$query = sqlite_query ($db, "SELECT * FROM table1;" );
// ในวงเราจะแสดงข้อมูลที่ได้รับทั้งหมด
ในขณะที่ ($array = sqlite_fetch_array ($query ))
{
echo($array [ "field1" ]. $array [ "field2" ]. " (รหัสรายการ: " . $array [ "id" ]. ")
" );
}
?>

SQLite เป็นฐานข้อมูลที่ค่อนข้างคล้ายกับ MySQL ความแตกต่างพื้นฐานระหว่าง SQLite และฐานข้อมูลอื่นคือฐานข้อมูลทั้งหมดเป็นไฟล์เดียว หากใน MySQL ฐานข้อมูลถูกเก็บไว้ที่ไหนสักแห่งในไวด์ของเซิร์ฟเวอร์และไม่พร้อมสำหรับการถ่ายโอนดังนั้นใน SQLite ทุกอย่างจะง่ายมาก: ไฟล์เดียว - หนึ่งฐานข้อมูล

แน่นอนว่าเซิร์ฟเวอร์จะต้องรองรับไดรเวอร์ SQLite (เช่นเดียวกับฐานข้อมูลอื่น ๆ ) แต่ตามกฎแล้วจะไม่มีปัญหากับสิ่งนี้ในขณะนี้

SQLite ช่วยให้คุณสามารถทำงานกับฐานข้อมูลโดยใช้ SQL ได้ตามปกติ โดยสร้างตาราง ฟิลด์ ฯลฯ โดยทั่วไปเราสามารถพูดได้ว่า SQLite นั้นไม่ด้อยไปกว่า MySQL ทั่วไปเลย ยกเว้นการทำงานที่ช้ากว่ากับแบบสอบถาม SQL ที่ "หนัก" สำหรับการอัปเดตข้อมูล (แทรกและอัปเดต) แต่นี่มีไว้สำหรับไซต์ที่มีการโหลดสูง

ข้อได้เปรียบอย่างมากของ SQLite คือความสะดวกในการพกพา คัดลอกไฟล์ - อะไรจะง่ายกว่านี้? คุณไม่จำเป็นต้องกังวลเกี่ยวกับการสำรองข้อมูล เช่นใน MySQL คุณไม่จำเป็นต้องสร้างผู้ใช้ด้วยรหัสผ่านบนเซิร์ฟเวอร์ คุณไม่จำเป็นต้องสร้างฐานข้อมูลเอง ด้วย SQLite เราเพียงแค่นำไปใช้และใช้งานมัน

หากต้องการทำงานกับฐานข้อมูลใน PHP ควรใช้ PDO - PHP Data Objects - นี่คือสิ่งที่เรียกว่า นามธรรมที่นำเสนออินเทอร์เฟซเดียวสำหรับการทำงานกับฐานข้อมูลที่แตกต่างกัน ตามทฤษฎีแล้ว เมื่อใช้ PDO คุณสามารถสลับไปยังฐานข้อมูลใดก็ได้โดยไม่ต้องเปลี่ยนการสืบค้น SQL เช่น จาก MySQL เป็น SQLite เฉพาะพารามิเตอร์การเชื่อมต่อเท่านั้นที่เปลี่ยนแปลง

วิธีนี้ SQLite จะเชื่อมต่อผ่าน PDO ไม่มีอะไรจำเป็นสำหรับสิ่งนี้ เนื่องจาก PDO เองก็รวมอยู่ใน PHP แล้ว และโดยปกติแล้วไดรเวอร์ SQLite จะรวมอยู่ในเซิร์ฟเวอร์เช่นกัน

แต่ก่อนที่คุณจะเริ่มเขียนโปรแกรม คุณต้องสร้างฐานขึ้นมาก่อน ตัวอย่างเช่นสำหรับ MySQL มี phpMyAdmin ซึ่งคุณสามารถดำเนินการต่างๆได้ นอกจากนี้ยังมีการพัฒนาที่คล้ายกันสำหรับ SQLite แต่ฉันจะแสดงวิธีที่คุณสามารถทำได้ผ่านเบราว์เซอร์ FireFox ในการดำเนินการนี้ คุณจะต้องติดตั้งส่วนเสริมเท่านั้น

หากต้องการเพิ่มส่วนเสริมนี้ลงในเมนูหลักของ FireFox ("แฮมเบอร์เกอร์") ให้คลิกแก้ไขแล้วลากไอคอนไปที่เมนู

ติดตั้งแล้วและคุณสามารถใช้งานได้

ขั้นแรก เรามาสร้างฐานข้อมูลใหม่กัน ใน SQLite นี่เป็นไฟล์แยกต่างหากที่จะมีนามสกุล .sqlite SQLite Manager จะแจ้งให้คุณระบุไดเร็กทอรีที่จะจัดเก็บไฟล์นี้ เลือกหรือสร้างไดเร็กทอรีใหม่ นี่ยังไม่สำคัญสำหรับเราเลย เป็นผลให้ไฟล์ sqlite พร้อมฐานข้อมูลใหม่จะถูกสร้างขึ้น

ไฟล์นี้สามารถย้าย (และเปลี่ยนชื่อ) ได้ทุกที่ จากนั้นเปิดด้วยคำสั่งเมนู ฐานข้อมูล - เชื่อมต่อฐานข้อมูล.

ตอนนี้คุณต้องสร้างตาราง (หรือตาราง) ในฐานข้อมูล

SQLite Manager จะสร้างตารางบริการโดยอัตโนมัติ sqlite_XXX- เราไม่แตะต้องพวกเขาและพวกเขาก็ไม่รบกวนเรา

ตารางในฐานข้อมูลเป็นที่เก็บข้อมูลที่มีโครงสร้าง ตารางจะต้องมีชุดของฟิลด์ที่มีคุณสมบัติที่ระบุ ตัวอย่างเช่น ฟิลด์อาจเป็นจำนวนเต็ม - สำหรับจำนวนเต็ม หรือข้อความ - สำหรับข้อความ จำนวนฟิลด์สามารถกำหนดเองได้และถูกกำหนดโดยงานของผู้ดูแลเว็บเท่านั้น

ตัวอย่างเช่น เรามีหน้าตารางที่มีเขตข้อมูล

  • รหัส- หมายเลขเฉพาะ (เพิ่มอัตโนมัติ)
  • กระสุน- ลิงค์
  • ข้อความ- ข้อความฟรี
  • ฮิต- จำนวนการดู

หลังจากสร้างตารางแล้ว ให้ใส่ใจกับบล็อก “คำสั่ง SQL ที่สร้างวัตถุนี้” โดยจะมีแบบสอบถาม SQL ที่สามารถใช้ในการสร้างตารางได้ มันจะมีประโยชน์ถ้าคุณต้องการสร้างตารางในฐานข้อมูลผ่าน PHP

แท็บมุมมองและการค้นหาช่วยให้คุณสามารถแก้ไขตารางได้ ตัวอย่างเช่น เรามาสร้างบรรทัดสองบรรทัดที่ฟิลด์ กระสุนจะถึงบ้านแล้วติดต่อกลับครับ สิ่งเหล่านี้จะเป็นสองหน้า: บ้านและ เว็บไซต์/ติดต่อ.

สนาม ฮิตจะมีตัวนับการดูเพจ ข้อความสามารถเป็นอะไรก็ได้

เพียงเท่านี้ฐานก็พร้อมแล้ว ตอนนี้คุณสามารถใช้งานได้แล้ว

มากำหนดภารกิจกัน ให้เรามีเว็บไซต์ง่ายๆ ที่จะแสดงข้อความที่เกี่ยวข้องและจำนวนการดูผ่านลิงค์สั้น (slug)

หากเราทำเช่นนี้บนเซิร์ฟเวอร์ภายในเครื่อง ให้ไซต์นั้นอยู่ในไดเร็กทอรี ตร.ม- มีไดเรกทอรีย่อยอยู่ในนั้น ฐานข้อมูลโดยที่เราจะคัดลอกของเรา หน้า.sqlite.

เราสามารถกำหนดเส้นทางตามที่อธิบายไว้ในบทความก่อนหน้านี้ ไฟล์.htaccess

เพิ่มตัวเลือก DefaultCharset UTF-8 - ดัชนี RewriteEngine บน RewriteBase /sqlite/ RewriteCond %(REQUEST_FILENAME) !-f RewriteCond %(REQUEST_FILENAME) !-d RewriteRule (.*) /sqlite/index.php?$1

ใน ดัชนี.phpการกำหนดเส้นทางจะอธิบายเป็นบรรทัดเดียว:

$หน้า = ($p = คีย์($_GET)) ? $p: "บ้าน";

  • เชื่อมต่อฐาน
  • เราทำการเลือกโดย $page
  • แสดงข้อมูลที่ได้รับ
ฉันตั้งใจลดความซับซ้อนของอัลกอริทึมเพื่อไม่ให้โค้ด PHP ซับซ้อน

มีสองตัวเลือกสำหรับการทำงานกับฐานข้อมูล อันแรกคือโค้ด PHP ดั้งเดิม มันไม่ซับซ้อนมาก แต่พารามิเตอร์มากมายนั้นน่ารำคาญเล็กน้อย ดังนั้น ตัวเลือกที่สองคือการใช้ไลบรารี wrapper เพิ่มเติม โค้ดจะกระชับยิ่งขึ้น

ฉันจะให้รหัส index.php ในเวอร์ชันแรก:

setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);

$sql ="SELECT * FROM เพจ WHERE slug=:page LIMIT 1"; $sth = $pdo->เตรียม($sql, อาร์เรย์(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));.

$sth->execute(array(":page" => $page));

$rows = $sth->fetchAll();

print_r($แถว); // ข้อมูลส่งออกที่นี่ ) catch(Exception $e) ( echo $e->getMessage(); ) # จุดสิ้นสุดของไฟล์

สำหรับตัวเลือกที่สอง ฉันใช้ไลบรารี php จากไซต์ labaka.ru ซึ่งฉันวางไว้ในไดเรกทอรีย่อย

ข้อมูลที่ส่งไปยังแบบสอบถาม sql จะต้องผ่านการตรวจสอบความถูกต้อง ใน PDO เมื่อใช้การเตรียมข้อมูล (PDO::prepare) การหลีกเลี่ยงพารามิเตอร์จะถูกบังคับ สิ่งนี้จะช่วยให้คุณสามารถป้องกันการแทรก SQL ที่อาจเกิดขึ้นได้

เมื่อเชื่อมต่อฐานข้อมูล SQLite หากไม่มีไฟล์ฐานข้อมูลก็จะถูกสร้างขึ้นโดยอัตโนมัติ นี่เป็นพื้นฐานสำหรับการสร้างฐานข้อมูลทันทีหลังจากเชื่อมต่อและสร้างตารางที่จำเป็นด้วยแบบสอบถาม sql แรก (ซึ่งฉันเขียนไว้ด้านบน)

อีกหนึ่งหมายเหตุเกี่ยวกับ SQLite เนื่องจากฐานข้อมูลเป็นไฟล์ จึงสามารถดาวน์โหลดได้จาก URL โดยตรงผ่านเบราว์เซอร์ ดังนั้นจึงเป็นการดีกว่าที่จะปกป้องไดเร็กทอรีด้วยไฟล์ SQLite ผ่าน .htaccess ด้วยคำสั่ง Deny from all หรือวางไว้สูงกว่าไดเรกทอรี www หลัก

SQLite มีประโยชน์สำหรับงานขนาดเล็กที่ต้องใช้ฐานข้อมูลขนาดเล็ก เช่น การนับ การลงคะแนน ข้อมูลเมตาของหน้า ฯลฯ

คุณสามารถดูบทความนี้ได้

วันก่อนฉันต้องสร้างระบบสำหรับสร้างข้อมูลอย่างรวดเร็วและบันทึกลงในฐานข้อมูล SQLite และทุกอย่างต้องทำงานอย่างรวดเร็ว อย่างไรก็ตาม จำเป็นต้องเพิ่มฐานข้อมูลใน MySQL สำหรับ MySQL มีเครื่องมือให้เลือกมากมายสำหรับการเพิ่มข้อมูล:

  1. แทรกอย่างง่าย
  2. INSERT และค่าเพิ่มมากมาย (BULK INSERT)
  3. เพิ่มผ่านไฟล์ CSV

ตัวเลือกหมายเลข 3 ที่เร็วที่สุดอย่างไม่ต้องสงสัย จริงๆ แล้วมันถูกนำไปใช้ในระบบแล้ว อย่างไรก็ตาม ตัวเลือกนี้ช่วยให้คุณเพิ่มบันทึกได้มากถึงหลายแสนรายการ/ล้านบันทึกลงในฐานข้อมูลในเวลาไม่กี่วินาที แน่นอนว่าฮาร์ดแวร์เซิร์ฟเวอร์ก็มีบทบาทสำคัญเช่นกัน แต่ตอนนี้จะไม่ได้รับการพิจารณาในตอนนี้

ดังที่เราทุกคนทราบดีและเคยเห็นมาแล้วหลายครั้ง ความสามารถที่มากขึ้นนั้นต้องการทรัพยากรที่มากขึ้นและ/หรือซอฟต์แวร์เพิ่มเติมเพื่อเพิ่มการโต้ตอบกับระบบนี้และกำหนดข้อจำกัดเพิ่มเติม

SQLite แตกต่างจาก MySQL ตรงที่มีน้ำหนักเบาและต้องการเพียงไลบรารีเดียวเท่านั้นจึงจะใช้งานได้ ไฟล์ฐานข้อมูลสามารถวางได้ทุกที่และถ่ายโอนได้ แต่การเพิ่มฐานข้อมูลสามารถทำได้ผ่านการ INSERT แบบง่ายๆ เท่านั้น ซึ่งหมายความว่าไม่รองรับการเพิ่มผ่าน "BULK" INSERT และหากตารางมีคีย์อย่างน้อยหนึ่งคีย์ (อย่างน้อยก็จะเป็นคีย์หลัก) การเพิ่มหนึ่งระเบียนก็หมายถึงการสร้างดัชนีใหม่ด้วย ตอนนี้ลองจินตนาการว่าคุณจำเป็นต้องเพิ่มบันทึกหลายพันรายการในเวลาที่สั้นที่สุด แม้ว่า SQLite จะเบาและรวดเร็วเพียงใด แต่ก็ใช้เวลานานพอสมควร

พบวิธีแก้ปัญหาที่ไม่คาดคิด (อย่างน้อยสำหรับฉัน - ฉันไม่ได้ศึกษาความเป็นไปได้ทั้งหมดของฐานข้อมูลนี้) - การใช้ธุรกรรม สิ่งนี้ทำให้ความเร็วเพิ่มขึ้น 10-100 เท่า การบันทึก/การทำธุรกรรมให้เสร็จสิ้นนั้นรวดเร็ว - อันที่จริงแล้ว ข้อมูลจะถูกเทลงในไฟล์ฐานข้อมูล

สิ่งที่อธิบายไว้นั้นดี แต่สำหรับทั้งชุด จำเป็นต้องเขียนข้อมูลนี้ลงในไฟล์ sqlite ที่แตกต่างกัน สำหรับสิ่งนี้ มีการใช้วิธีการที่เรียบง่ายและผ่านการพิสูจน์แล้ว - การใช้ตัวอธิบายหลายตัว โชคดีที่มีไฟล์น้อย หลังจากการดัดแปลงทั้งหมดนี้ เรามีสคริปต์ที่ทำงานในเวลาน้อยกว่า 5 นาทีและเขียนข้อมูลไปยังไฟล์ N โดยมีบรรทัด M ในแต่ละไฟล์ ผมขอจองทันที - ในกรณีนี้ไฟล์ฐานข้อมูลแต่ละไฟล์จะมีหนึ่งตาราง

และตอนนี้มีตัวเลขบางส่วน:

ในฐานข้อมูลทดสอบ ธุรกรรมถูกเปิดสำหรับแต่ละไฟล์ จากนั้นจึงปิดและบันทึก หมายเหตุสำคัญ: แต่ละ SQLite สามารถอนุญาตให้มีเพียงหนึ่งตัวจัดการต่อไฟล์เท่านั้น ถ้าคุณพยายามโต้ตอบกับฐานข้อมูลด้วยหมายเลขอ้างอิงที่สอง ข้อผิดพลาดจะเกิดขึ้น

อย่างที่คุณเห็น วิธีนี้ทำให้คุณสามารถเพิ่มข้อมูลจำนวนมากได้ในเวลาอันสั้น

เป็นที่น่าสังเกตว่าเมื่อฉันบอกว่าวิธีเดียวที่จะเพิ่มฐานข้อมูลไปยัง SQLite คือการ INSERT แบบง่าย ฉันไม่ได้ระบุว่านี่เป็นเพียงตัวเลือกเดียวที่ใช้ภาษา SQL

มีตัวเลือกอื่น - อะนาล็อกของ "โหลดข้อมูล ... " ใน MySQL - การนำเข้าข้อมูลจากไฟล์ CSV เฉพาะตัวเลือกนี้เท่านั้นที่ให้คุณเพิ่มข้อมูลได้โดยตรงจากสภาพแวดล้อม SQLite กล่าวอีกนัยหนึ่ง คุณต้องเปิดฐานข้อมูลก่อน เช่น เรียกฐานข้อมูลจากคอนโซล

นำเข้าตาราง path_to_csv_file

ตัวคั่นเริ่มต้นคืออักขระ "|"

ในการเปลี่ยนตัวคั่นคุณต้องเรียกใช้คำสั่ง:

ตัวคั่น

ในฐานะตัวคั่น คุณต้องระบุตัวคั่นคอลัมน์ เช่น ""

ความเร็วของการบวกในกรณีนี้เกินความเร็วของวิธีที่อธิบายไว้ก่อนหน้านี้ 100 เท่า แล้วเหตุใดจึงไม่ใช้วิธีนี้? ประเด็นก็คือ: ภาษาโปรแกรมฝั่งเซิร์ฟเวอร์ (ในกรณีนี้คือ PHP) สามารถใช้ไลบรารี sqlite เวอร์ชันหนึ่งได้ และอีกเวอร์ชันหนึ่งอาจ (หรืออาจไม่) ติดตั้งบนระบบก็ได้ เมื่อรวมการโต้ตอบ sqlite ทั้งสองวิธีนี้ฐานข้อมูลอาจไม่พร้อมใช้งานสำหรับตัวเลือกใดตัวเลือกหนึ่ง - ข้อผิดพลาดจะเกิดขึ้นเมื่อพยายามอ่าน

นี่คือไลบรารีที่เขียนด้วยภาษา C ที่ให้การทำงานกับ SQL เครื่องมือนี้เป็นของระบบการจัดการฐานข้อมูลเชิงสัมพันธ์ ฐานข้อมูล SQL ส่วนใหญ่ทำงานบนพื้นฐานไคลเอนต์/เซิร์ฟเวอร์ ลองใช้ MySQL เป็นตัวอย่าง ในระหว่างการดำเนินการ ข้อมูลจะถูกดึงมาจากเซิร์ฟเวอร์ MySQL และส่งเป็นการตอบสนองต่อคำขอ ในกรณีของการใช้ SQLite ข้อมูลจะถูกดึงมาจากดิสก์โดยตรง เช่น ไม่จำเป็นต้องติดต่อกับเซิร์ฟเวอร์

การติดตั้ง

เราจะโต้ตอบกับฐานข้อมูลผ่านทางอินเตอร์เฟสบรรทัดคำสั่ง sqlite3(CLI) บนลินุกซ์ ทำงานกับ sqlite3 CLI ใน MAC OS และ Windows ดำเนินการในลักษณะเดียวกัน แต่ฉันขอแนะนำให้คุณใช้เวลา 5 นาทีในการติดตั้งเครื่องเสมือนเพื่อไม่ให้คอมพิวเตอร์ของคุณเกะกะด้วยซอฟต์แวร์ที่ไม่จำเป็น

หากต้องการติดตั้ง sqlite3 บน Linux ให้รันคำสั่ง:

sudo apt-get ติดตั้ง sqlite3 libsqlite3-dev

ผลที่ได้คือเครื่องของคุณก็จะมี sqlite3- หากต้องการติดตั้งเครื่องมือนี้ในระบบปฏิบัติการอื่น ให้ทำตามคำแนะนำ หากต้องการเริ่ม sqlite ให้รันคำสั่ง sqlite3 ในคอนโซล ผลลัพธ์ควรเป็นดังนี้:

บรรทัดที่สองมีคำแนะนำว่าคุณต้องเรียกใช้ command.help เพื่อขอความช่วยเหลือ มาทำสิ่งนี้กันเถอะ ผลที่ตามมาเราจะได้เห็น คำสั่งเมตาและคำอธิบายของพวกเขา

คำสั่งเมตา

คำสั่งเมตา- ออกแบบมาเพื่อสร้างตารางและการดำเนินการด้านการดูแลระบบอื่น ๆ พวกเขาทั้งหมดจบลง จุด- มาดูรายการคำสั่งที่อาจมีประโยชน์กันดีกว่า:

คำสั่งมาตรฐาน

ตอนนี้เรามาดูรายการกันดีกว่า คำสั่งมาตรฐาน sqlite3 ซึ่งออกแบบมาเพื่อโต้ตอบกับฐานข้อมูล คำสั่งมาตรฐานสามารถจำแนกได้เป็นสามกลุ่ม:

  • ข้อมูล คำอธิบาย ภาษา DDL: คำสั่งเพื่อสร้างตาราง แก้ไขและลบฐานข้อมูล ตาราง และอื่นๆ
  • ภาษาการจัดการข้อมูล DML: อนุญาตให้ผู้ใช้จัดการข้อมูล (เพิ่ม/เปลี่ยนแปลง/ลบ)
  • ภาษาแบบสอบถาม DQL: อนุญาตให้ดึงข้อมูล
  • บันทึก: SQLite ยังรองรับคำสั่งอื่นๆ อีกมากมาย ซึ่งสามารถพบได้ในรายการคำสั่งต่างๆ เนื่องจากบทเรียนนี้มีไว้สำหรับผู้เริ่มต้น เราจะจำกัดตัวเองให้อยู่ในชุดคำสั่งที่ระบุไว้

    ไฟล์ฐานข้อมูล SQLite ได้แก่ ข้ามแพลตฟอร์ม- สามารถพบได้บนอุปกรณ์ประเภทต่างๆ

    • อีเมล
    • ความคิดเห็น

    ในฟิลด์ทั้งหมดนี้ เฉพาะที่อยู่ไซต์เท่านั้นที่สามารถเว้นว่างได้ เรายังแนะนำคอลัมน์สำหรับใส่ลำดับความคิดเห็นได้ด้วย เรียกมันว่า post_id กันดีกว่า

    ตอนนี้เรามากำหนดประเภทข้อมูลสำหรับแต่ละคอลัมน์กันดีกว่า:

    คุณลักษณะ ชนิดข้อมูล
    post_id จำนวนเต็ม
    ชื่อ ข้อความ
    อีเมล ข้อความ
    เว็บไซต์_url ข้อความ
    ความคิดเห็น ข้อความ

    คุณจะสามารถค้นหาข้อมูลทุกประเภทที่รองรับใน SQLite3

    ควรสังเกตว่าใน SQLite3 ข้อมูลที่แทรกลงในคอลัมน์อาจแตกต่างจากประเภทที่ระบุ สิ่งนี้จะไม่ทำงานใน MySQL

    ตอนนี้เรามาสร้างฐานข้อมูลกันดีกว่า หากคุณยังคงอยู่ในอินเทอร์เฟซ sqlite3 ให้พิมพ์ command.quit เพื่อออก ตอนนี้ป้อน:

    sqlite3 comment_section.db

    ดังนั้นในไดเร็กทอรีปัจจุบันเราจะมีไฟล์ comment_section.db.

    บันทึก: หากคุณไม่ระบุชื่อไฟล์ sqlite3 จะสร้างฐานข้อมูลชั่วคราว

    การสร้างตาราง

    ในการจัดเก็บความคิดเห็น เราจำเป็นต้องสร้างตาราง เรียกมันว่าความคิดเห็น เราดำเนินการคำสั่ง:

    สร้างความคิดเห็นของตาราง (post_id INTEGER ไม่ใช่ NULL การเพิ่มคีย์หลักโดยอัตโนมัติ, ชื่อข้อความไม่เป็นโมฆะ, ข้อความอีเมลไม่เป็นโมฆะ, เว็บไซต์ _url TEXT NULL, ความคิดเห็นข้อความไม่เป็นโมฆะ);

    NOT NULL จะช่วยให้แน่ใจว่าเซลล์ไม่มีค่าว่าง คีย์หลักและการเพิ่มอัตโนมัติจะขยายขีดความสามารถของฟิลด์ post_id.

    หากต้องการตรวจสอบว่าตารางถูกสร้างขึ้นแล้ว ให้รันคำสั่ง .tables meta ด้วยเหตุนี้เราจึงเห็นตารางความคิดเห็นของเรา

    บันทึก: หากต้องการดูโครงสร้างตาราง ให้พิมพ์ .schema comment

    ตอนนี้เราสามารถป้อนข้อมูลลงในตารางได้แล้ว

    การแทรกแถว

    สมมติว่าเราต้องสร้างรายการต่อไปนี้:

    ชื่อ: ชีวาม มัมเกน อีเมล์: [ป้องกันอีเมล]เว็บไซต์: shivammg.blogspot.com ความคิดเห็น: บทช่วยสอนที่ยอดเยี่ยมสำหรับผู้เริ่มต้น

    ในการแทรกเราจะใช้คำสั่ง แทรก.

    แทรกความคิดเห็น (ชื่อ, อีเมล, website_url, ความคิดเห็น) ค่า ("Shivam Mamgain", " [ป้องกันอีเมล]", "shivammg.blogspot.com", "บทช่วยสอนที่ยอดเยี่ยมสำหรับผู้เริ่มต้น");

    ไม่จำเป็นต้องระบุค่าสำหรับ post_id เนื่องจาก มันจะถูกสร้างขึ้นโดยอัตโนมัติด้วยการตั้งค่า AUTOINCREMENT

    หากต้องการเติมมือของคุณ คุณสามารถแทรกอีกสองสามบรรทัดได้

    ตัวอย่าง

    ในการดึงข้อมูลเราจะใช้คำสั่ง เลือก.

    เลือก post_id, ชื่อ, อีเมล, website_url, ความคิดเห็นจากความคิดเห็น;

    คำขอเดียวกันอาจมีลักษณะดังนี้:

    SELECT * จากความคิดเห็น;

    ด้วยเหตุนี้ แถวทั้งหมดจะถูกแยกออกจากตาราง ผลลัพธ์อาจปรากฏขึ้นโดยไม่มีการคั่นคอลัมน์และไม่มีส่วนหัว เพื่อแก้ไขปัญหานี้ เราทำ:

    หากต้องการแสดงส่วนหัว ให้ป้อน .headers ON

    หากต้องการแสดงคอลัมน์ ให้รันคำสั่ง .mode column

    เราดำเนินการ เลือกขออีกครั้ง.

    บันทึก: สามารถเปลี่ยนประเภทการแสดงผลได้โดยใช้คำสั่ง .mode meta

    อัปเดต

    สมมติว่าสนามนั้น อีเมลสำหรับผู้ใช้ 'Shivam Mamgain' จะต้องเปลี่ยนเป็น ' [ป้องกันอีเมล]- เรารันคำสั่งต่อไปนี้:

    ส่งผลให้รายการมีการเปลี่ยนแปลง

    บันทึก: ค่าคอลัมน์ ชื่ออาจไม่ซ้ำกัน ดังนั้นอาจมีมากกว่าหนึ่งแถวที่ได้รับผลกระทบจากคำสั่ง สำหรับผู้ใช้ทุกคนที่มีค่า ชื่อ= ‘ศิวัม มัมเกน’, ฟิลด์ อีเมลจะถูกเปลี่ยนเป็น ' [ป้องกันอีเมล]- หากต้องการเปลี่ยนเส้นใดเส้นหนึ่ง คุณต้องติดตามโดยใช้ช่อง post_id- เรากำหนดให้มันเป็นคีย์หลัก ซึ่งจะทำให้มั่นใจถึงความเป็นเอกลักษณ์ของค่า