數據庫在動態網站中扮演着一個關鍵的角色,所有流入流出的數據都會和數據庫進行交互。因此,如果PHP應用的數據庫沒有進行較好的設計或優化,其性能將會受到非常大的影響。
MySQL數據庫
MySQL安裝完成後的默認設置所提供的性能並不是最優的,我們總有辦法對其進行進一步優化,提升 性能。切記,數據庫設計是影響性能的關鍵因素,設計很糟糕的數據庫會對整個性能造成嚴重影響。
查詢緩存(Query Caching)
查詢緩存是MySQL的一個重要性能特性,它緩存了SELECT查詢及其結果數據集。當一個同樣的 SELECT查詢發生時,MySQL從內存中直接取出結果,這樣就加快了查詢的執行速度,同時減小了數據庫 的壓力。
若要查看MySQL服務器上的查詢緩存是否已經打開,要在MySQL命令行界面執行以下命令。
SHOW VARIABLES LIKE 'have_query_cache';
若要開啓查詢緩存,可以打開my.cnf文件,並輸入以下內容。如果已經有這些內容但是包含註釋,則 去除註釋即可。
query_cache_type = 1
query_cache_size = 128MB
query_cache_limit = 1MB
保存my.conf文件,重啓MySQL服務器。
存儲引擎(表類型)
MySQL提供9個存儲引擎,使用最廣泛的是MyISAM和InnoDB。
MyISAM
爲速度而設計,和Select搭配起來使用更好,如果表的數據偏向於靜態,使用MyISAM最好。
- MyISAM支持表級鎖。
- MyISAM支持全文搜索。
- MyISAM數據壓縮、自我複製、查詢緩存、數據加密。
- MyISAM不支持外鍵。
- MyISAM不支持事務。
- MyISAM支持集羣數據庫。
InnoDB(默認存儲引擎)
爲高可靠性和高性能而設計的,適合處理大量數據。
- InnoDB支持行級鎖。
- InnoDB支持外鍵。
- InnoDB支持事務。
- InnoDB數據壓縮、自我複製、查詢緩存、數據加密。
- InnoDB可以用在集羣環境下,但是並沒有完全支持,不過InnoDB表可以完全轉換爲NDB存儲引擎,這樣既可用於集羣環境。
Percona 數據庫和 Percona XtraDB 存儲引擎
Percona 是免費、開源的數據庫,對於MySQL完全兼容且提供加強功能,可完全代替MySQL並能提供更好的文檔、性能、擴展性。
Percona 由 MySQL 衍生,支持MySQL的所有特性,並在此基礎上提供更多、更好的性能。Percona使用一種改進的存儲引擎——XtraDB,它是InnoDB的加強版,有更多的特性和更快的速度,在現代硬件上有有着更好的擴展性,Percona XtraDB在高負載環境下使用內存的效率更高。
Percona只能在Linux系統上使用,目前不能在Windows系統上使用。具體安裝可參考Percona安裝手冊
MySQL性能監控工具
phpMyAdmin 提供有視圖工具查看 MySQL 性能狀態;
Percona XtraDB集羣(PXC)
Percona XtraDB集羣提供了高性能的集羣環境,能輕鬆配置和管理多臺數據庫服務器,使得數據庫之 間能使用二進制日誌來互相通信。集羣環境能將負載分散到不同的數據庫服務器中,並提供災備,以防止服務器死機。
爲了配置集羣環境,我們需要以下服務器。
- 第一臺服務器IP 10.211.55.1,稱爲Node1。
- 第二臺服務器IP 10.211.55.2,稱爲Node2。
- 第三臺服務器IP 10.211.55.3,稱爲Node3。
1.在終端中執行如下命令,在 Node1 上安裝Percona XtraDB集羣。
apt-get install percona-xtradb-cluster-56
安裝將會啓動,安裝過程與普通的 Percona 服務器安裝類似。安裝過程中將會要求輸入root用戶的密碼。
2.當安裝完成後,我們需要創建一個擁有複製權限的新用戶。登錄進去,在 MySQL 終端執行以下命令。
# 創建了一個用戶,用戶名是sstpackt,密碼是sstuserpassw
CREATE USER 'sstpackt'@'localhost' IDENTIFIED BY 'sstuserpassword';
# 設置並刷新權限
GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'sstpackt'@' localhost';
FLUSH PRIVILEGES;
3.打開 MySQL 配置文件 /etc/mysql/my.cnf,在mysqld區塊下輸入以下配置。
# 添加 galera 庫
wsrep_provider=/usr/lib/libgalera_smm.so
# 添加集羣節點地址
wsrep_cluster_address=gcomm://10.211.55.1,10.211.55.2,10.211.55.3
# binlog 格式爲 ROW
binlog_format=ROW
# 默認存儲引擎是 InnoDB
default_storage_engine=InnoDB
# InnoDB auto_increment 鎖定模式設置爲2,這是 galera 需要的
innodb_autoinc_lock_mode=2
# Node 1的地址
wsrep_node_address=10.211.55.1
# SST 模式
wsrep_sst_method=xtrabackup
# SST模式的驗證,設置賬號密碼
wsrep_sst_auth="sstpackt:sstuserpassword"
# 爲集羣命名
wsrep_cluster_name=packt_cluster
4.執行下面的命令,啓動第一個節點。
/etc/init.d/mysql bootstrap-pxc
該命令將啓動第一個節點,也就意味着將初始的集羣啓動和運行起來,並決定哪一個節點帶有正確的信息,以及哪一個節點將會同步給所有其他節點。因爲 Node1 是集羣的初始節點,並且創建了一個新用戶,因此我們將只啓動 Node1。
5.檢查 Node1 啓動狀態。
SHOW STATUS LIKE '%wsrep%';
這將輸出一個非常長的列表,其中一部分如下圖所示。
6.現在,對所有節點重複步驟1和3。
需要爲每個節點變更的唯一配置是 wsrep_ node_address,其值應該爲節點的 IP 地址。對於每個節點來說,編輯 my.cnf 配置文件,在 wsrep_node_address 上設置節點的 IP 地址即可。
7.在終端中執行如下命令,開啓兩個新建的節點。
/etc/init.d/mysql start
此時每個節點都可以通過重複步驟 7 來驗證是否正常。
爲了驗證集羣是否能正常工作,在某個節點上創建一個數據庫並添加幾張表,再向表中添加一些數 據。之後,在其他節點上檢查新創建的數據庫、表以及保存在每張表中的數據。如果正常,則所有這些數 據將會被同步到每個節點中。
Redis
Redis是開源的內存型鍵值存儲系統,廣泛用於數據庫緩存。根據Redis網站(www.Redis.io)的介紹, Redis支持字符串、哈希表、隊列、集合和有序集合,同時也支持主從複製和事務。
Memcached
Memcached是一個免費、開源、高性能、分佈式的內存對象緩存系 統。Memcached屬於內存型的鍵值存儲,可以保存從數據庫或者API調用獲取的數據。
類似於Redis,Memcached也能用於加速網站。Memcached將數據(字符串和對象)保存到內存中,這 樣可以減少和外部資源的交互,例如與數據庫或API交互。
參考:《高性能PHP7,Learning PHP7 High Performance》