概述
mysql native driver(mysqlnd) 自從php5.3.0開始成爲官方源代碼的一部分,
用來取代傳統的mysql client library(libmysql)。
mysqlnd是C語言寫成的PHP擴展(PHP extension)。
php5.3.0之前,碼農們操作數據庫使用的mysql擴展函數(mysql_connect,mysql_query等函數), mysqli系列函數, PDO MYSQL函數,都是通過libmysql來與mysql數據庫進行通信的。
mysqlnd出現之後,SA們就多了一個選擇: 可以通過mysqlnd來與mysql數據庫進行通信。
mysqlnd不能做什麼
雖然mysqlnd是一個PHP擴展,但它卻沒有提供任何的php函數(或者說是API)給碼農們使用。
碼農們仍然使用mysql 擴展函數(mysql_connect, mysql_query…),或者mysqli,或者PDO MYSQL來操作數據庫。 這些函數都可以通過mysqlnd來與mysql數據庫通信。
它是數據庫與php函數的中間層。
爲什麼要使用mysqlnd
原來的libmysql用的好好的,爲什麼還要搞一個mysqlnd出來呢?
原因一: license問題
libmysql是MYSQL AB公司開發的,現在已經是Oracle集團所屬的了,它使用MYSQL license發佈。
This ultimately led to MySQL support being disabled by default in PHP
mysqlnd 是php的一部分,使用PHP license發佈。
從此 licensing 的問題就算是解決了。
原因二:編譯問題
使用libmysql的時候,如果要正常編譯php,必須首先安裝好mysql。
如果是單純的一臺WEB服務器,裝個mysql似乎有點浪費了。
mysqlnd的話,就不必安裝mysql,直接可用。
原因三:性能問題
由於mysqlnd是一個php擴展,使用了php memory management system,在內存使用方面效率相當高。
舉個例子:
使用libmysql的時候,mysql結果集中的每一行都在內存中儲存了二次!
使用mysqlnd,結果集只會儲存一次。
而且它還服從於php.ini中memory_limit的設置。
Using MySQL Native Driver leads to comparable or better performance than using MySQL Client Library。
mysqlnd的新特性
1 改進的persistent connection。
2 特殊函數 mysqli_fetch_all()
http://cn2.php.net/manual/en/mysqli-result.fetch-all.php
只有安裝了mysqlnd, mysqli中的這個函數纔可用。
3 Performance statistics calls: mysqli_get_cache_stats(), mysqli_get_client_stats(), mysqli_get_connection_stats()
在分析性能瓶頸的時候,這些函數還是蠻好用的。
詳細文檔可以看這裏: http://cn2.php.net/manual/en/mysqlnd.stats.php
4 使用mysqlnd之後,mysqli也支持persistent connection了。
這樣看起來,mysqli受益最多。
5 PHP 5.3.3 之後,mysqlnd支持SSL。
6 PHP 5.3.2 之後,mysqlnd支持Compressed Protocol
7 PHP 5.3.4 之後,windows系統中的mysqlnd支持Named Pipes。
如何安裝mysqlnd
LINUX環境中,默認情況下,php中的mysql擴展還是會使用libmysql的。
如果要使用mysqlnd,就要加一個configure的參數:
./configure --with-mysql=mysqlnd / --with-mysqli=mysqlnd / --with-pdo-mysql=mysqlnd / [other options]
這樣mysql, mysqli, pdo mysql都會使用mysqlnd。
WINDOWS中,mysqlnd默認啓用,並且mysql, mysqli, pdo 默認都會使用mysqlnd。
什麼都不用做。