MySQL vs MySQLi เมื่อใช้ PHP [ปิด]


167

ไหนดีกว่ากัน MySQL หรือ MySQLi และทำไม? ฉันควรใช้แบบไหน

ฉันหมายถึงดีกว่าไม่เพียง แต่ในแง่ของประสิทธิภาพ แต่คุณสมบัติอื่น ๆ ที่เกี่ยวข้อง

คำตอบ:


111

หากคุณดูที่MySQL ภาพรวมส่วนต่อขยายที่ปรับปรุงแล้วมันควรบอกทุกสิ่งที่คุณจำเป็นต้องรู้เกี่ยวกับความแตกต่างระหว่างทั้งสอง

คุณสมบัติที่มีประโยชน์หลักคือ:

  • อินเตอร์เฟสแบบ Object-oriented
  • การสนับสนุนสำหรับงบที่เตรียมไว้
  • รองรับหลายงบ
  • สนับสนุนการทำธุรกรรม
  • ความสามารถในการดีบักที่ปรับปรุงแล้ว
  • การสนับสนุนเซิร์ฟเวอร์ฝังตัว

1
ใช่สิ่งที่ดีที่สุดคือ mysqli สนับสนุนงบที่เตรียมไว้
jondinham

7
ควรสังเกตว่า MySQLi ใช้งานได้กับ MySQL 5+ เท่านั้น สิ่งนี้ไม่เกี่ยวข้องกันอีกต่อไป แต่เมื่อ MySQLi ออกมา MySQL 4 ยังคงเป็นมาตรฐาน นี่เป็นส่วนหนึ่งของเหตุผลที่ส่วนขยายแยกออกจากกันไดรเวอร์ MySQL ตัวเก่าที่อยู่ที่นั่นเพื่อจุดประสงค์ในการใช้งานร่วมกันได้
zneak

6
เป็นที่น่าสังเกตว่าสิ่งต่าง ๆ ได้เปลี่ยนแปลงไปมากในหกปี mysql_*()เลิกใช้แล้วและจะถูกลบในไม่ช้า คุณไม่ควรใช้มันสำหรับรหัสใหม่

เราควรเลือกซีพียูและแรมให้น้อยลง
Mahdi Jazini

1
ดูคำตอบของกอร์ดอนด้านล่าง ส่วนขยาย mysql เก่าไม่ได้รับการสนับสนุนอีกต่อไปดังนั้นคุณจะใช้งานส่วนขยาย mysqli ได้ดีขึ้น
Mark Davidson

70

มีหน้าคู่มือที่อุทิศตนเพื่อช่วยในการเลือกระหว่าง mysql, mysqli และ PDO ที่

ทีมงาน PHP แนะนำ mysqli หรือ PDO_MySQL สำหรับการพัฒนาใหม่:

ขอแนะนำให้ใช้นามสกุล mysqli หรือ PDO_MySQL ไม่แนะนำให้ใช้นามสกุล mysql เก่าสำหรับการพัฒนาใหม่ เมทริกซ์การเปรียบเทียบคุณสมบัติแบบละเอียดมีให้ด้านล่าง ประสิทธิภาพโดยรวมของส่วนขยายทั้งสามนั้นถือว่าใกล้เคียงกัน แม้ว่าประสิทธิภาพของส่วนขยายนั้นจะมีเพียงเศษเสี้ยวของเวลาทำงานทั้งหมดของการร้องขอเว็บ PHP บ่อยครั้งที่ผลกระทบต่ำถึง 0.1%

หน้านี้ยังมีคุณสมบัติเมทริกซ์เปรียบเทียบ API ส่วนขยาย ความแตกต่างที่สำคัญระหว่าง mysqli และ mysql API มีดังนี้:

                               mysqli     mysql
Development Status             Active     Maintenance only
Lifecycle                      Active     Long Term Deprecation Announced*
Recommended                    Yes        No
OOP API                        Yes        No
Asynchronous Queries           Yes        No
Server-Side Prep. Statements   Yes        No
Stored Procedures              Yes        No
Multiple Statements            Yes        No
Transactions                   Yes        No
MySQL 5.1+ functionality       Yes        No

* http://news.php.net/php.internals/53799

มีเมทริกคุณลักษณะเพิ่มเติมเพิ่มเติมเปรียบเทียบไลบรารี (mysqlnd ใหม่กับ libmysql) ที่

และบทความบล็อกที่ละเอียดมากที่


15

ฉันได้ละทิ้งการใช้ mysqli มันไม่เสถียรเกินไป ฉันเคยมีคำถามที่ผิดพลาด PHP โดยใช้ mysqli แต่ทำงานได้ดีกับแพ็คเกจ mysql นอกจากนี้ยังmysqli เกิดปัญหาในคอลัมน์ ข้อผิดพลาดนี้ได้รับการเลี้ยงดูในรูปแบบต่าง ๆ อย่างน้อยตั้งแต่ 2005 และยังคงเสีย ฉันสุจริตต้องการใช้งบเตรียม แต่ mysqli เพียงไม่น่าเชื่อถือเพียงพอ (และดูเหมือนว่าไม่มีใครสนใจแก้ไข) ถ้าคุณต้องการงบเตรียมไปด้วย PDO


2
PDO ก็ไม่ได้สมบูรณ์แบบเช่นกัน (ฉันเคยเจอกับ coredumps ที่น่ารังเกียจด้วย) แต่อย่างน้อยมันก็มีฐานผู้ใช้ที่กว้างกว่าดังนั้นมันน่าจะปลอดภัยกว่า
troelskn

@troelskn ดังนั้น mysql จึงไม่ดีกว่าปกติใช่ไหม
Pacerier

@Pierier พิจารณาแล้วว่าเลิกใช้แล้วฉันจะบอกว่าไม่ โดยทั่วไปดูเหมือนว่า PDO ได้กลายเป็นตัวเลือกมาตรฐานแล้ว
troelskn

@troelskn แต่เลิกใช้แล้วไม่ได้มีความหมายอะไรเลยยกเว้นว่าจะไม่มีในรุ่นอนาคต ในแง่ของความมั่นคง mysql ไม่เสถียรกว่าปกติใช่ไหม
Pacerier

1
ณ จุดนี้ (5.5) PHP จะออกคำเตือนอย่างแข็งขันถ้าคุณใช้: php.net/manual/en/migration55.deprecated.php
troelskn

13

MySQLi ย่อมาจากการปรับปรุง MySQL มันเป็นอินเทอร์เฟซเชิงวัตถุในการผูก MySQL ซึ่งทำให้การใช้งานง่ายขึ้น นอกจากนี้ยังมีการสนับสนุนงบเตรียม (ซึ่งมีประโยชน์มาก ) ถ้าคุณใช้ PHP 5 ให้ใช้ MySQLi


5

สิ่งที่ดีกว่าคือ PDO มันเป็นอินเทอร์เฟซที่ crufty น้อยกว่าและยังมีคุณสมบัติเช่นเดียวกับ MySQLi

การใช้ข้อความที่เตรียมไว้เป็นสิ่งที่ดีเพราะช่วยลดโอกาสในการฉีด SQL การใช้คำสั่งที่เตรียมไว้ฝั่งเซิร์ฟเวอร์นั้นไม่ดีเนื่องจากเพิ่มจำนวนรอบการเดินทาง


3

สำหรับฉันงบที่เตรียมไว้เป็นคุณสมบัติที่ต้องมี ยิ่งไปกว่านั้นการเชื่อมพารามิเตอร์ (ซึ่งใช้ได้กับคำสั่งที่เตรียมไว้) เท่านั้น เป็นวิธีเดียวที่มีเหตุผลจริงๆในการแทรกสตริงลงในคำสั่ง SQL ฉันไม่เชื่อในฟังก์ชั่น 'escaping' จริงๆ การเชื่อมต่อฐานข้อมูลเป็นโปรโตคอลเลขฐานสองทำไมต้องใช้โปรโตคอลย่อยแบบ จำกัด ASCII สำหรับพารามิเตอร์


1
PDO มักจะใช้คำสั่งที่เตรียมไว้ฝั่งไคลเอ็นต์ดังนั้นจึงไม่ได้เตรียมไว้บนเซิร์ฟเวอร์จริงๆ - แต่มันดีเพราะมันช่วยประหยัดทรัพยากรของเซิร์ฟเวอร์และมักจะทำงานได้ดีขึ้น คำสั่งที่เตรียมไว้ "การจำลอง" จะหนีสิ่งต่าง ๆ ได้อย่างถูกต้องเสมอ
MarkR

1
"เสมอ" และ "หนี" เป็นคำอันตรายเมื่อไปด้วยกัน ฉันไม่รู้รหัสนี้อาจปราศจากข้อผิดพลาดทั้งหมด แต่ทำไมต้องรำคาญใจเมื่อมีโปรโตคอลไบนารีจริง สำหรับประสิทธิภาพนั้นเปิดรับการเปรียบเทียบ
Javier
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.