A. postgresql 怎麼做快照
1.在伺服器端選中一台客戶機右擊,然後點擊「客戶端屬性」,彈出客戶端屬性對話框
2.在客戶端對話框中,先將下端還原操作系統的「勾」去掉,然後點擊「高級」出現客戶端高級設置對話框,在系統盤設置中將緩存存放位置選為服務端,其他地方不要做任何更改。
3.重啟該客戶機,開始安裝軟體,安裝過程中,會發現該機器緩存大小這一欄里緩存數值不斷增加,直至安裝完軟體。(重新啟動,再次運行該軟體,以便確定該軟體是否運行正常)
4.關閉客戶機,等伺服器上該客戶機狀態顯示為未運行後,在服務端點擊「鏡像管理」
5.在鏡像菜單中選中該客戶機使用的鏡像,單擊「快照管理」按鈕。
6.選中該客戶機使用的快照節點,然後點擊「生成快照」
7.在cache文件選項中選中製作快照的客戶機,會自動填充下面的緩存路徑,在快照信息子項中輸入快照名名稱和快照描述信息,點擊「確定」按鈕後,快照則做好了。
8選中所有客戶機右擊打開客戶端屬性對話框,在「啟動菜單設置」中,將新做成的快照節點推送到用於啟動的鏡像這一欄中移動到最頂端,點擊確定。
PostGreSQL採用「快照」方式來實現MVCC。具體地說,這意味著每一個事務中的查詢僅能看到:
1.該事務啟動之前已經提交的事務所作出的數據更改。
2.當前事務中該查詢之前的查詢所作出的更改。
PostGreSQL在每個事務啟動時為該事務獲取一個當前的資料庫快照,快照中數據結構如下:
typedef struct SnapshotData
{
SnapshotSatisfiesFunc satisfies; /*行測試函數指針*/
TransactionId xmin; /* id小於xmin的所有事務更改在當前快照中可見 */
TransactionId xmax; /* id大於xmax的所有事務更改在當前快照中可見 */
uint32 xcnt; /* 正在運行的事務的計數 */
TransactionId *xip; /* 所有正在運行的事務的id列表 */
/* note: all ids in xip[] satisfy xmin <= xip[i] < xmax */
int32 subxcnt; /* # of xact ids in subxip[], -1 if overflow */
TransactionId *subxip; /* array of subxact IDs in progress */
CommandId curcid; /* in my xact, CID < curcid are visible */
uint32 active_count; /* refcount on ActiveSnapshot stack */
uint32 regd_count; /* refcount on RegisteredSnapshotList */
bool copied; /* false if it』s a static snapshot */
} SnapshotData;
Transaction啟動時形成快照就是要記錄該Transaction可見的TransactionID,排除不可見的ID。PostGreSQL中每一個版本的數據有兩個ID,其中一個是CreationID即插入該數據的TransactionID,一個是ExpiredID,即刪除或更新該數據的TransactionID。對一個Transaction可見的數據的ID要滿足以下條件:
1.CreationID<當前TransactionID
2.ExpiredID>當前TransactionID或ExpiredID不存在
Transaction啟動形成快照的過程:
遍歷當前所有活動的Transaction,記錄在一個活動Transaction的ID數組中;根據Transaction的先後順序,選擇當前Transaction可見的最小TransactionID,記錄在xmin,選擇可見的最大TransactionID,記錄在xmax中。
PostGreSQL8.5中進行最終的版本選擇是在從外存中獲取一個頁面的數據之後,由一個檢驗函數(HeapTupleSatisfiesMVCC等一系列函數)檢驗所有該頁面數據的數據對當前Transaction的可見性,如果不可見,則將數據除去,最後返回所有可見數據。
B. postgresql和mysql的區別
特性 MySQL PostgreSQL
實例 通過執行 MySQL 命令(mysqld)啟動實例。一個實例可以管理一個或多個資料庫。一台伺服器可以運行多個 mysqld 實例。一個實例管理器可以監視 mysqld 的各個實例。
通過執行 Postmaster 進程(pg_ctl)啟動實例。一個實例可以管理一個或多個資料庫,這些資料庫組成一個集群。集群是磁碟上的一個區域,這個區域在安裝時初始化並由一個目錄組成,所有數據都存儲在這個目錄中。使用 initdb 創建第一個資料庫。一台機器上可以啟動多個實例。
資料庫 資料庫是命名的對象集合,是與實例中的其他資料庫分離的實體。一個 MySQL 實例中的所有資料庫共享同一個系統編目。 資料庫是命名的對象集合,每個資料庫是與其他資料庫分離的實體。每個資料庫有自己的系統編目,但是所有資料庫共享 pg_databases。
數據緩沖區 通過 innodb_buffer_pool_size 配置參數設置數據緩沖區。這個參數是內存緩沖區的位元組數,InnoDB 使用這個緩沖區來緩存表的數據和索引。在專用的資料庫伺服器上,這個參數最高可以設置為機器物理內存量的 80%。 Shared_buffers 緩存。在默認情況下分配 64 個緩沖區。默認的塊大小是 8K。可以通過設置 postgresql.conf 文件中的 shared_buffers 參數來更新緩沖區緩存。
資料庫連接 客戶機使用 CONNECT 或 USE 語句連接資料庫,這時要指定資料庫名,還可以指定用戶 id 和密碼。使用角色管理資料庫中的用戶和用戶組。 客戶機使用 connect 語句連接資料庫,這時要指定資料庫名,還可以指定用戶 id 和密碼。使用角色管理資料庫中的用戶和用戶組。
身份驗證 MySQL 在資料庫級管理身份驗證。 基本只支持密碼認證。 PostgreSQL 支持豐富的認證方法:信任認證、口令認證、Kerberos 認證、基於 Ident 的認證、LDAP 認證、PAM 認證
加密 可以在表級指定密碼來對數據進行加密。還可以使用 AES_ENCRYPT 和 AES_DECRYPT 函數對列數據進行加密和解密。可以通過 SSL 連接實現網路加密。 可以使用 pgcrypto 庫中的函數對列進行加密/解密。可以通過 SSL 連接實現網路加密。
審計 可以對 querylog 執行 grep。 可以在表上使用 PL/pgSQL 觸發器來進行審計。
查詢解釋 使用 EXPLAIN 命令查看查詢的解釋計劃。 使用 EXPLAIN 命令查看查詢的解釋計劃。
備份、恢復和日誌 InnoDB 使用寫前(write-ahead)日誌記錄。支持在線和離線完全備份以及崩潰和事務恢復。需要第三方軟體才能支持熱備份。 在數據目錄的一個子目錄中維護寫前日誌。支持在線和離線完全備份以及崩潰、時間點和事務恢復。 可以支持熱備份。
JDBC 驅動程序 可以從 參考資料 下載 JDBC 驅動程序。 可以從 參考資料 下載 JDBC 驅動程序。
表類型 取決於存儲引擎。例如,NDB 存儲引擎支持分區表,內存引擎支持內存表。 支持臨時表、常規表以及范圍和列表類型的分區表。不支持哈希分區表。 由於PostgreSQL的表分區是通過表繼承和規則系統完成了,所以可以實現更復雜的分區方式。
索引類型 取決於存儲引擎。MyISAM:BTREE,InnoDB:BTREE。 支持 B-樹、哈希、R-樹和 Gist 索引。
約束 支持主鍵、外鍵、惟一和非空約束。對檢查約束進行解析,但是不強制實施。 支持主鍵、外鍵、惟一、非空和檢查約束。
存儲過程和用戶定義函數 支持 CREATE PROCEDURE 和 CREATE FUNCTION 語句。存儲過程可以用 SQL 和 C++ 編寫。用戶定義函數可以用 SQL、C 和 C++ 編寫。 沒有單獨的存儲過程,都是通過函數實現的。用戶定義函數可以用 PL/pgSQL(專用的過程語言)、PL/Tcl、PL/Perl、PL/Python 、SQL 和 C 編寫。
觸發器 支持行前觸發器、行後觸發器和語句觸發器,觸發器語句用過程語言復合語句編寫。 支持行前觸發器、行後觸發器和語句觸發器,觸發器過程用 C 編寫。
系統配置文件 my.conf Postgresql.conf
資料庫配置 my.conf Postgresql.conf
客戶機連接文件 my.conf pg_hba.conf
XML 支持 有限的 XML 支持。 有限的 XML 支持。
數據訪問和管理伺服器 OPTIMIZE TABLE —— 回收未使用的空間並消除數據文件的碎片
myisamchk -analyze —— 更新查詢優化器所使用的統計數據(MyISAM 存儲引擎)
mysql —— 命令行工具
MySQL Administrator —— 客戶機 GUI 工具 Vacuum —— 回收未使用的空間
Analyze —— 更新查詢優化器所使用的統計數據
psql —— 命令行工具
pgAdmin —— 客戶機 GUI 工具
並發控制 支持表級和行級鎖。InnoDB 存儲引擎支持 READ_COMMITTED、READ_UNCOMMITTED、REPEATABLE_READ 和 SERIALIZABLE。使用 SET TRANSACTION ISOLATION LEVEL 語句在事務級設置隔離級別。 支持表級和行級鎖。支持的 ANSI 隔離級別是 Read Committed(默認 —— 能看到查詢啟動時資料庫的快照)和 Serialization(與 Repeatable Read 相似 —— 只能看到在事務啟動之前提交的結果)。使用 SET TRANSACTION 語句在事務級設置隔離級別。使用 SET SESSION 在會話級進行設置。
MySQL相對於PostgreSQL的劣勢:
MySQL
PostgreSQL
最重要的引擎InnoDB很早就由Oracle公司控制。目前整個MySQL資料庫都由Oracle控制。
BSD協議,沒有被大公司壟斷。
對復雜查詢的處理較弱,查詢優化器不夠成熟
很強大的查詢優化器,支持很復雜的查詢處理。
只有一種表連接類型:嵌套循環連接(nested-loop),不支持排序-合並連接(sort-merge join)與散列連接(hash join)。
都支持
C. 如何擴大postgresql存儲空間
1. 概述
cstore_fdw實現了 PostgreSQL 資料庫的列式存儲。列存儲非常適合用於數據分析的場景,數據分析的場景下數據是批量載入的。
這個擴展使用了Optimized Row Columnar (ORC)數據存儲格式,ORC改進了Facebook的RCFile格式,帶來如下好處:
壓縮:將內存和磁碟中數據大小削減到2到4倍。可以擴展以支持不同壓縮演算法。
列投影:只提取和查詢相關的列數據。提升IO敏感查詢的性能。
跳過索引:為行組存儲最大最小統計值,並利用它們跳過無關的行。
2. 使用
cstore_fdw的安裝和使用都非常簡單,可以參考官方資料。
thub.com/citusdata/cstore_fdw
注)注意cstore_fdw只支持PostgreSQL9.3和9.4 。
下面做幾個簡單的性能對比,看看cstore_fdw究竟能帶來多大的性能提升。
2.1 數據載入
2.1.1 普通表
CREATE TABLE tb1
(
id int,
c1 TEXT,
c2 TEXT,
c3 TEXT,
c4 TEXT,
c5 TEXT,
c6 TEXT,
c7 TEXT,
c8 TEXT,
c9 TEXT,
c10 TEXT
);
注:要和普通表的全表掃描作對比,所以不建主鍵和索引。
[postgres@node2 chenhj]$ time psql -p 40382 -At -F, -c "select id,id::text,id::text,id::text,id::text,id::text,id::text,id::text,id::text,id::text,id::text from generate_series(1,10000000) id"|time psql -p 40382 -c " tb1 from STDIN with CSV"
COPY 10000000
1.56user 1.00system 6:42.39elapsed 0%CPU (0avgtext+0avgdata 7632maxresident)k
776inputs+0outputs (17major+918minor)pagefaults 0swaps
real 6m42.402s
user 0m15.174s
sys 0m14.904s
postgres=# select pg_total_relation_size('tb1'::regclass);
pg_total_relation_size
------------------------
1161093120
(1 row)
postgres=# \timing
Timing is on.
postgres=# analyze tb1;
ANALYZE
Time: 11985.070 ms
插入1千萬條記錄,數據佔用存儲大小1.16G,插入耗時6分42秒,分析耗時12秒。
2.1.2 cstore表
$ mkdir -p /home/chenhj/data94/cstore
CREATE EXTENSION cstore_fdw;
CREATE SERVER cstore_server FOREIGN DATA WRAPPER cstore_fdw;
CREATE FOREIGN TABLE cstb1
(
id int,
c1 TEXT,
c2 TEXT,
c3 TEXT,
c4 TEXT,
c5 TEXT,
c6 TEXT,
c7 TEXT,
c8 TEXT,
c9 TEXT,
c10 TEXT
)
SERVER cstore_server
OPTIONS(filename '/home/chenhj/data94/cstore/cstb1.cstore',
compression 'pglz');
[postgres@node2 chenhj]$ time psql -p 40382 -At -F, -c "select id,id::text,id::text,id::text,id::text, www.hnne.com id::text,id::text,id::text,id::text,id::text,id::text from generate_series(1,10000000) id"|time psql -p 40382 -c " cstb1 from STDIN with CSV"
COPY 10000000
1.53user 0.78system 7:35.15elapsed 0%CPU (0avgtext+0avgdata 7632maxresident)k
968inputs+0outputs (20major+920minor)pagefaults 0swaps
real 7m35.520s
user 0m14.809s
sys 0m14.170s
[postgres@node2 chenhj]$ ls -l /home/chenhj/data94/cstore/cstb1.cstore
-rw------- 1 postgres postgres 389583021 Jun 23 17:32 /home/chenhj/data94/cstore/cstb1.cstore
postgres=# \timing
Timing is on.
postgres=# analyze cstb1;
ANALYZE
Time: 5946.476 ms
插入1千萬條記錄,數據佔用存儲大小390M,插入耗時7分35秒,分析耗時6秒。
使用cstore列存儲後,數據佔用存儲大小降到普通表的3分之1。需要說明的是,由於所有TEXT列填充了隨機數據,壓縮率不算高,某些實際的應用場景下壓縮效果會比這更好。
2.2 Text列的like查詢性能對比
2.2.1 普通表
清除文件系統緩存,並重啟PostgreSQL
[postgres@node2 chenhj]$ pg_ctl -D /home/chenhj/data94 -l logfile94 restart
[root@node2 ~]# free
total used free shared buffers cached
Mem: 2055508 771356 1284152 0 9900 452256
-/+ buffers/cache: 309200 1746308
Swap: 4128760 387624 3741136
[root@node2 ~]# echo 1 > /proc/sys/vm/drop_caches
[root@node2 ~]# free
total used free shared buffers cached
Mem: 2055508 326788 1728720 0 228 17636
-/+ buffers/cache: 308924 1746584
Swap: 4128760 381912 3746848
對Text列執行like查詢
[postgres@node2 chenhj]$ iostat -k dm-2
Linux 2.6.32-71.el6.x86_64 (node2) 06/23/14 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.80 0.00 0.38 3.42 0.00 95.40
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
dm-2 58.55 330.68 212.08 7351441 4714848
[postgres@node2 chenhj]$ time psql -p 40382 -c "select count(*) from tb1 where c1 like '%66'"
count
--------
100000
(1 row)
real 0m7.051s
user 0m0.001s
sys 0m0.004s
[postgres@node2 chenhj]$ iostat -k dm-2
Linux 2.6.32-71.el6.x86_64 (node2) 06/23/14 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.80 0.00 0.38 3.43 0.00 95.39
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
dm-2 58.90 381.53 211.90 8489597 4714956
耗時7.1秒,產生IO讀1.14G,IO寫108K。
不清文件系統緩存,不重啟PostgreSQL,再執行一次。消耗時間降到1.6秒,幾乎不產生IO。
[postgres@node2 chenhj]$ iostat -k dm-2
Linux 2.6.32-71.el6.x86_64 (node2) 06/23/14 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.80 0.00 0.38 3.43 0.00 95.39
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
dm-2 58.81 332.20 213.06 7350301 4714364
[postgres@node2 chenhj]$ time psql -p 40382 -c "select count(*) from tb1 where c1 like '%66'"
count
--------
100000
(1 row)
real 0m1.601s
user 0m0.002s
sys 0m0.001s
[postgres@node2 chenhj]$ iostat -k dm-2
Linux 2.6.32-71.el6.x86_64 (node2) 06/23/14 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.80 0.00 0.38 3.43 0.00 95.38
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
dm-2 58.80 332.12 213.01 7350337 4714364
2.2.2 cstore表
清除文件系統緩存,並重啟PostgreSQL
[postgres@node2 chenhj]$ pg_ctl -D /home/chenhj/data94 -l logfile94 restart
[root@node2 ~]# echo 1 > /proc/sys/vm/drop_caches
對Text列執行like查詢
[postgres@node2 chenhj]$ iostat -k dm-2
Linux 2.6.32-71.el6.x86_64 (node2) 06/23/14 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.80 0.00 0.38 3.38 0.00 95.45
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
dm-2 58.12 376.42 209.04 8492017 4716048
[postgres@node2 chenhj]$ time psql -p 40382 -c "select count(*) from cstb1 where c1 like '%66'"
count
--------
100000
(1 row)
real 0m2.786s
user 0m0.002s
sys 0m0.003s
[postgres@node2 chenhj]$ iostat -k dm-2
Linux 2.6.32-71.el6.x86_64 (node2) 06/23/14 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.80 0.00 0.38 3.38 0.00 95.44
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
dm-2 58.12 378.75 208.89 8550761 4716048
耗時2.8秒,產生IO讀59M,IO寫0K。執行時間優化的雖然不是太多,但IO大大減少,可見列投影起到了作用。
不清文件系統緩存,不重啟PostgreSQL,再執行一次。消耗時間降到1.4秒,幾乎不產生IO。
[postgres@node2 chenhj]$ iostat -k dm-2
Linux 2.6.32-71.el6.x86_64 (node2) 06/23/14 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.80 0.00 0.38 3.36 0.00 95.47
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
dm-2 57.75 376.33 207.58 8550809 4716524
[postgres@node2 chenhj]$ time psql -p 40382 -c "select count(*) from cstb1 where c1 like '%66'"
count
--------
100000
(1 row)
real 0m1.424s
user 0m0.002s
sys 0m0.001s
[postgres@node2 chenhj]$ iostat -k dm-2
Linux 2.6.32-71.el6.x86_64 (node2) 06/23/14 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.80 0.00 0.38 3.36 0.00 95.47
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
dm-2 57.70 375.96 207.38 8550809 4716588
2.3 對Int列執行=查詢
2.3.1 普通表
清除文件系統緩存,並重啟PostgreSQL後
[postgres@node2 chenhj]$ pg_ctl -D /home/chenhj/data94 -l logfile94 restart
[root@node2 ~]# echo 1 > /proc/sys/vm/drop_caches
對Int列執行=查詢
[postgres@node2 chenhj]$ iostat -k dm-2
Linux 2.6.32-71.el6.x86_64 (node2) 06/23/14 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.79 0.00 0.37 3.33 0.00 95.50
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
dm-2 57.25 373.21 205.67 8560897 4717624
[postgres@node2 chenhj]$ time psql -p 40382 -c "select count(*) from tb1 where id =666666"
count
-------
1
(1 row)
real 0m6.844s
user 0m0.002s
sys 0m0.006s
[postgres@node2 chenhj]$ iostat -k dm-2
Linux 2.6.32-71.el6.x86_64 (node2) 06/23/14 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.79 0.00 0.37 3.34 0.00 95.49
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
dm-2 57.60 422.57 205.54 9699161 4717708
耗時6.8秒,產生IO讀1.14G,IO寫84K
不清緩存,再執行一次。消耗時間降到1.1秒,幾乎不產生IO。
[postgres@node2 chenhj]$ iostat -k dm-2
Linux 2.6.32-71.el6.x86_64 (node2) 06/23/14 _x86_64_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.79 0.00 0.37 3.33 0.00 95.50
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
dm-2 57.44 421.37 204.97 9699177 4718032
[postgres@node2 chenhj]$ time psql -p 40382 -c "select count(*) from tb1 where id =666666"
count
-------
D. 為什麼postgrelsql的性能沒有mysql好
一、 PostgreSQL 的穩定性極強, Innodb 等引擎在崩潰、斷電之類的災難場景下抗打擊能力有了長足進步,然而很多 MySQL 用戶都遇到過Server級的資料庫丟失的場景——mysql系統庫是MyISAM的,相比之下,PG資料庫這方面要好一些。
二、任何系統都有它的性能極限,在高並發讀寫,負載逼近極限下,PG的性能指標仍可以維持雙曲線甚至對數曲線,到頂峰之後不再下降,而 MySQL 明顯出現一個波峰後下滑(5.5版本之後,在企業級版本中有個插件可以改善很多,不過需要付費)。
三、PG 多年來在 GIS 領域處於優勢地位,因為它有豐富的幾何類型,實際上不止幾何類型,PG有大量字典、數組、bitmap 等數據類型,相比之下mysql就差很多,instagram就是因為PG的空間資料庫擴展POSTGIS遠遠強於MYSQL的my spatial而採用PGSQL的。
四、PG 的「無鎖定」特性非常突出,甚至包括 vacuum 這樣的整理數據空間的操作,這個和PGSQL的MVCC實現有關系。
五、PG 的可以使用函數和條件索引,這使得PG資料庫的調優非常靈活,mysql就沒有這個功能,條件索引在web應用中很重要。
六、PG有極其強悍的 SQL 編程能力(9.x 圖靈完備,支持遞歸!),有非常豐富的統計函數和統計語法支持,比如分析函數(ORACLE的叫法,PG里叫window函數),還可以用多種語言來寫存儲過程,對於R的支持也很好。這一點上MYSQL就差的很遠,很多分析功能都不支持,騰訊內部數據存儲主要是MYSQL,但是數據分析主要是HADOOP+PGSQL。
七、PG 的有多種集群架構可以選擇,plproxy 可以支持語句級的鏡像或分片,slony 可以進行欄位級的同步設置,standby 可以構建WAL文件級或流式的讀寫分離集群,同步頻率和集群策略調整方便,操作非常簡單。
八、一般關系型資料庫的字元串有限定長度8k左右,無限長 TEXT 類型的功能受限,只能作為外部大數據訪問。而 PG 的 TEXT 類型可以直接訪問,SQL語法內置正則表達式,可以索引,還可以全文檢索,或使用xml xpath。用PG的話,文檔資料庫都可以省了。
九,對於WEB應用來說,復制的特性很重要,mysql到現在也是非同步復制,pgsql可以做到同步,非同步,半同步復制。還有mysql的同步是基於binlog復制,類似oracle golden gate,是基於stream的復制,做到同步很困難,這種方式更加適合異地復制,pgsql的復制基於wal,可以做到同步復制。同時,pgsql還提供stream復制。
十,pgsql對於numa架構的支持比mysql強一些,比MYSQL對於讀的性能更好一些,pgsql提交可以完全非同步,而mysql的內存表不夠實用(因為表鎖的原因)
最後說一下我感覺 PG 不如 MySQL 的地方。
第一,MySQL有一些實用的運維支持,如 slow-query.log ,這個pg肯定可以定製出來,但是如果可以配置使用就更好了。
第二是mysql的innodb引擎,可以充分優化利用系統所有內存,超大內存下PG對內存使用的不那麼充分,
第三點,MySQL的復制可以用多級從庫,但是在9.2之前,PGSQL不能用從庫帶從庫。
第四點,從測試結果上看,mysql 5.5的性能提升很大,單機性能強於pgsql,5.6應該會強更多.
第五點,對於web應用來說,mysql 5.6 的內置MC API功能很好用,PGSQL差一些。
另外一些:
pgsql和mysql都是背後有商業公司,而且都不是一個公司。大部分開發者,都是拿工資的。
說mysql的執行速度比pgsql快很多是不對的,速度接近,而且很多時候取決於你的配置。
對於存儲過程,函數,視圖之類的功能,現在兩個資料庫都可以支持了。
另外多線程架構和多進程架構之間沒有絕對的好壞,oracle在unix上是多進程架構,在windows上是多線程架構。
很多pg應用也是24/7的應用,比如skype. 最近幾個版本VACUUM基本不影響PGSQL 運行,8.0之後的PGSQL不需要cygwin就可以在windows上運行。
至於說對於事務的支持,mysql和pgsql都沒有問題。
E. 有用PostgreSQL的嗎,哪個package好用一些
特性 MySQL PostgreSQL
實例 通過執行 MySQL 命令(mysqld)啟動實例。一個實例可以管理一個或多個資料庫。一台伺服器可以運行多個 mysqld 實例。一個實例管理器可以監視 mysqld 的各個實例。
通過執行 Postmaster 進程(pg_ctl)啟動實例。一個實例可以管理一個或多個資料庫,這些資料庫組成一個集群。集群是磁碟上的一個區域,這個區域在安裝時初始化並由一個目錄組成,所有數據都存儲在這個目錄中。使用 initdb 創建第一個資料庫。一台機器上可以啟動多個實例。
資料庫 資料庫是命名的對象集合,是與實例中的其他資料庫分離的實體。一個 MySQL 實例中的所有資料庫共享同一個系統編目。 資料庫是命名的對象集合,每個資料庫是與其他資料庫分離的實體。每個資料庫有自己的系統編目,但是所有資料庫共享 pg_databases。
數據緩沖區 通過 innodb_buffer_pool_size 配置參數設置數據緩沖區。這個參數是內存緩沖區的位元組數,InnoDB 使用這個緩沖區來緩存表的數據和索引。在專用的資料庫伺服器上,這個參數最高可以設置為機器物理內存量的 80%。 Shared_buffers 緩存。在默認情況下分配 64 個緩沖區。默認的塊大小是 8K。可以通過設置 postgresql.conf 文件中的 shared_buffers 參數來更新緩沖區緩存。
資料庫連接 客戶機使用 CONNECT 或 USE 語句連接資料庫,這時要指定資料庫名,還可以指定用戶 id 和密碼。使用角色管理資料庫中的用戶和用戶組。 客戶機使用 connect 語句連接資料庫,這時要指定資料庫名,還可以指定用戶 id 和密碼。使用角色管理資料庫中的用戶和用戶組。
身份驗證 MySQL 在資料庫級管理身份驗證。 基本只支持密碼認證。 PostgreSQL 支持豐富的認證方法:信任認證、口令認證、Kerberos 認證、基於 Ident 的認證、LDAP 認證、PAM 認證
加密 可以在表級指定密碼來對數據進行加密。還可以使用 AES_ENCRYPT 和 AES_DECRYPT 函數對列數據進行加密和解密。可以通過 SSL 連接實現網路加密。 可以使用 pgcrypto 庫中的函數對列進行加密/解密。可以通過 SSL 連接實現網路加密。
審計 可以對 querylog 執行 grep。 可以在表上使用 PL/pgSQL 觸發器來進行審計。
查詢解釋 使用 EXPLAIN 命令查看查詢的解釋計劃。 使用 EXPLAIN 命令查看查詢的解釋計劃。
備份、恢復和日誌 InnoDB 使用寫前(write-ahead)日誌記錄。支持在線和離線完全備份以及崩潰和事務恢復。需要第三方軟體才能支持熱備份。 在數據目錄的一個子目錄中維護寫前日誌。支持在線和離線完全備份以及崩潰、時間點和事務恢復。 可以支持熱備份。
JDBC 驅動程序 可以從 參考資料 下載 JDBC 驅動程序。 可以從 參考資料 下載 JDBC 驅動程序。
表類型 取決於存儲引擎。例如,NDB 存儲引擎支持分區表,內存引擎支持內存表。 支持臨時表、常規表以及范圍和列表類型的分區表。不支持哈希分區表。 由於PostgreSQL的表分區是通過表繼承和規則系統完成了,所以可以實現更復雜的分區方式。
索引類型 取決於存儲引擎。MyISAM:BTREE,InnoDB:BTREE。 支持 B-樹、哈希、R-樹和 Gist 索引。
約束 支持主鍵、外鍵、惟一和非空約束。對檢查約束進行解析,但是不強制實施。 支持主鍵、外鍵、惟一、非空和檢查約束。
存儲過程和用戶定義函數 支持 CREATE PROCEDURE 和 CREATE FUNCTION 語句。存儲過程可以用 SQL 和 C++ 編寫。用戶定義函數可以用 SQL、C 和 C++ 編寫。 沒有單獨的存儲過程,都是通過函數實現的。用戶定義函數可以用 PL/pgSQL(專用的過程語言)、PL/Tcl、PL/Perl、PL/Python 、SQL 和 C 編寫。
觸發器 支持行前觸發器、行後觸發器和語句觸發器,觸發器語句用過程語言復合語句編寫。 支持行前觸發器、行後觸發器和語句觸發器,觸發器過程用 C 編寫。
系統配置文件 my.conf Postgresql.conf
資料庫配置 my.conf Postgresql.conf
客戶機連接文件 my.conf pg_hba.conf
XML 支持 有限的 XML 支持。 有限的 XML 支持。
數據訪問和管理伺服器 OPTIMIZE TABLE —— 回收未使用的空間並消除數據文件的碎片
myisamchk -analyze —— 更新查詢優化器所使用的統計數據(MyISAM 存儲引擎)
mysql —— 命令行工具
MySQL Administrator —— 客戶機 GUI 工具 Vacuum —— 回收未使用的空間
Analyze —— 更新查詢優化器所使用的統計數據
psql —— 命令行工具
pgAdmin —— 客戶機 GUI 工具
並發控制 支持表級和行級鎖。InnoDB 存儲引擎支持 READ_COMMITTED、READ_UNCOMMITTED、REPEATABLE_READ 和 SERIALIZABLE。使用 SET TRANSACTION ISOLATION LEVEL 語句在事務級設置隔離級別。 支持表級和行級鎖。支持的 ANSI 隔離級別是 Read Committed(默認 —— 能看到查詢啟動時資料庫的快照)和 Serialization(與 Repeatable Read 相似 —— 只能看到在事務啟動之前提交的結果)。使用 SET TRANSACTION 語句在事務級設置隔離級別。使用 SET SESSION 在會話級進行設置。
MySQL相對於PostgreSQL的劣勢:
MySQL
PostgreSQL
最重要的引擎InnoDB很早就由Oracle公司控制。目前整個MySQL資料庫都由Oracle控制。
BSD協議,沒有被大公司壟斷。
對復雜查詢的處理較弱,查詢優化器不夠成熟
很強大的查詢優化器,支持很復雜的查詢處理。
只有一種表連接類型:嵌套循環連接(nested-loop),不支持排序-合並連接(sort-merge join)與散列連接(hash join)。
都支持
性能優化工具與度量信息不足
提供了一些性能視圖,可以方便的看到發生在一個表和索引上的select、delete、update、insert統計信息,也可以看到cache命中率。網上有一個開源的pgstatspack工具。
InnoDB的表和索引都是按相同的方式存儲。也就是說表都是索引組織表。這一般要求主鍵不能太長而且插入時的主鍵最好是按順序遞增,否則對性能有很大影響。
不存在這個問題。
大部分查詢只能使用表上的單一索引;在某些情況下,會存在使用多個索引的查詢,但是查詢優化器通常會低估其成本,它們常常比表掃描還要慢。
不存在這個問題
表增加列,基本上是重建表和索引,會花很長時間。
表增加列,只是在數據字典中增加表定義,不會重建表
存儲過程與觸發器的功能有限。可用來編寫存儲過程、觸發器、計劃事件以及存儲函數的語言功能較弱
除支持pl/pgsql寫存儲過程,還支持perl、python、Tcl類型的存儲過程:pl/perl,pl/python,pl/tcl。
也支持用C語言寫存儲過程。
不支持Sequence。
支持
不支持函數索引,只能在創建基於具體列的索引。
不支持物化視圖。
支持函數索引,同時還支持部分數據索引,通過規則系統可以實現物化視圖的功能。
執行計劃並不是全局共享的, 僅僅在連接內部是共享的。
執行計劃共享
MySQL支持的SQL語法(ANSI SQL標准)的很小一部分。不支持遞歸查詢、通用表表達式(Oracle的with 語句)或者窗口函數(分析函數)。
都 支持
不支持用戶自定義類型或域(domain)
支持。
對於時間、日期、間隔等時間類型沒有秒以下級別的存儲類型
可以精確到秒以下。
身份驗證功能是完全內置的,不支持操作系統認證、PAM認證,不支持LDAP以及其它類似的外部身份驗證功能。
支持OS認證、Kerberos 認證 、Ident 的認證、LDAP 認證、PAM 認證
不支持database link。有一種叫做Federated的存儲引擎可以作為一個中轉將查詢語句傳遞到遠程伺服器的一個表上,不過,它功能很粗糙並且漏洞很多
有dblink,同時還有一個dbi-link的東西,可以連接到oracle和mysql上。
Mysql Cluster可能與你的想像有較大差異。開源的cluster軟體較少。
復制(Replication)功能是非同步的,並且有很大的局限性.例如,它是單線程的(single-threaded),因此一個處理能力更強的Slave的恢復速度也很難跟上處理能力相對較慢的Master.
有豐富的開源cluster軟體支持。
explain看執行計劃的結果簡單。
explain返回豐富的信息。
類似於ALTER TABLE或CREATE TABLE一類的操作都是非事務性的.它們會提交未提交的事務,並且不能回滾也不能做災難恢復
DDL也是有事務的。
PostgreSQL主要優勢:
1. PostgreSQL完全免費,而且是BSD協議,如果你把PostgreSQL改一改,然後再拿去賣錢,也沒有人管你,這一點很重要,這表明了PostgreSQL資料庫不會被其它公司控制。oracle資料庫不用說了,是商業資料庫,不開放。而MySQL資料庫雖然是開源的,但現在隨著SUN被oracle公司收購,現在基本上被oracle公司控制,其實在SUN被收購之前,MySQL中最重要的InnoDB引擎也是被oracle公司控制的,而在MySQL中很多重要的數據都是放在InnoDB引擎中的,反正我們公司都是這樣的。所以如果MySQL的市場范圍與oracle資料庫的市場范圍沖突時,oracle公司必定會犧牲MySQL,這是毫無疑問的。
2. 與PostgreSQl配合的開源軟體很多,有很多分布式集群軟體,如pgpool、pgcluster、slony、plploxy等等,很容易做讀寫分離、負載均衡、數據水平拆分等方案,而這在MySQL下則比較困難。
3. PostgreSQL源代碼寫的很清晰,易讀性比MySQL強太多了,懷疑MySQL的源代碼被混淆過。所以很多公司都是基本PostgreSQL做二次開發的。
4. PostgreSQL在很多方面都比MySQL強,如復雜SQL的執行、存儲過程、觸發器、索引。同時PostgreSQL是多進程的,而MySQL是線程的,雖然並發不高時,MySQL處理速度快,但當並發高的時候,對於現在多核的單台機器上,MySQL的總體處理性能不如PostgreSQL,原因是MySQL的線程無法充分利用CPU的能力。
目前只想到這些,以後想到再添加,歡迎大家拍磚。
PostgreSQL與oracle或InnoDB的多版本實現的差別
PostgreSQL與oracle或InnoDB的多版本實現最大的區別在於最新版本和歷史版本是否分離存儲,PostgreSQL不分,而oracle和InnoDB分,而innodb也只是分離了數據,索引本身沒有分開。
PostgreSQL的主要優勢在於:
1. PostgreSQL沒有回滾段,而oracle與innodb有回滾段,oracle與Innodb都有回滾段。對於oracle與Innodb來說,回滾段是非常重要的,回滾段損壞,會導致數據丟失,甚至資料庫無法啟動的嚴重問題。另由於PostgreSQL沒有回滾段,舊數據都是記錄在原先的文件中,所以當資料庫異常crash後,恢復時,不會象oracle與Innodb資料庫那樣進行那麼復雜的恢復,因為oracle與Innodb恢復時同步需要redo和undo。所以PostgreSQL資料庫在出現異常crash後,資料庫起不來的幾率要比oracle和mysql小一些。
2. 由於舊的數據是直接記錄在數據文件中,而不是回滾段中,所以不會象oracle那樣經常報ora-01555錯誤。
3. 回滾可以很快完成,因為回滾並不刪除數據,而oracle與Innodb,回滾時很復雜,在事務回滾時必須清理該事務所進行的修改,插入的記錄要刪除,更新的記錄要更新回來(見row_undo函數),同時回滾的過程也會再次產生大量的redo日誌。
4. WAL日誌要比oracle和Innodb簡單,對於oracle不僅需要記錄數據文件的變化,還要記錄回滾段的變化。
PostgreSQL的多版本的主要劣勢在於:
1、最新版本和歷史版本不分離存儲,導致清理老舊版本需要作更多的掃描,代價比較大,但一般的資料庫都有高峰期,如果我們合理安排VACUUM,這也不是很大的問題,而且在PostgreSQL9.0中VACUUM進一步被加強了。
2、由於索引中完全沒有版本信息,不能實現Coverage index scan,即查詢只掃描索引,直接從索引中返回所需的屬性,還需要訪問表。而oracle與Innodb則可以;
進程模式與線程模式的對比
PostgreSQL和oracle是進程模式,MySQL是線程模式。
進程模式對多CPU利用率比較高。
進程模式共享數據需要用到共享內存,而線程模式數據本身就是在進程空間內都是共享的,不同線程訪問只需要控制好線程之間的同步。
線程模式對資源消耗比較少。
所以MySQL能支持遠比oracle多的更多的連接。
對於PostgreSQL的來說,如果不使用連接池軟體,也存在這個問題,但PostgreSQL中有優秀的連接池軟體軟體,如pgbouncer和pgpool,所以通過連接池也可以支持很多的連接。
堆表與索引組織表的的對比
Oracle支持堆表,也支持索引組織表
PostgreSQL只支持堆表,不支持索引組織表
Innodb只支持索引組織表
索引組織表的優勢:
表內的數據就是按索引的方式組織,數據是有序的,如果數據都是按主鍵來訪問,那麼訪問數據比較快。而堆表,按主鍵訪問數據時,是需要先按主鍵索引找到數據的物理位置。
索引組織表的劣勢:
索引組織表中上再加其它的索引時,其它的索引記錄的數據位置不再是物理位置,而是主鍵值,所以對於索引組織表來說,主鍵的值不能太大,否則佔用的空間比較大。
對於索引組織表來說,如果每次在中間插入數據,可能會導致索引分裂,索引分裂會大大降低插入的性能。所以對於使用innodb來說,我們一般最好讓主鍵是一個無意義的序列,這樣插入每次都發生在最後,以避免這個問題。
由於索引組織表是按一個索引樹,一般它訪問數據塊必須按數據塊之間的關系進行訪問,而不是按物理塊的訪問數據的,所以當做全表掃描時要比堆錶慢很多,這可能在OLTP中不明顯,但在數據倉庫的應用中可能是一個問題。
PostgreSQL9.0中的特色功能:
PostgreSQL中的Hot Standby功能
也就是standby在應用日誌同步時,還可以提供只讀服務,這對做讀寫分離很有用。這個功能是oracle11g才有的功能。
PostgreSQL非同步提交(Asynchronous Commit)的功能:
這個功能oracle中也是到oracle11g R2才有的功能。因為在很多應用場景中,當宕機時是允許丟失少量數據的,這個功能在這樣的場景中就特別合適。在PostgreSQL9.0中把synchronous_commit設置為false就打開了這個功能。需要注意的是,雖然設置為了非同步提交,當主機宕機時,PostgreSQL只會丟失少量數據,非同步提交並不會導致數據損壞而資料庫起不來的情況。MySQL中沒有聽說過有這個功能。
PostgreSQL中索引的特色功能:
PostgreSQL中可以有部分索引,也就是只能表中的部分數據做索引,create index 可以帶where 條件。同時PostgreSQL中的索引可以反向掃描,所以在PostgreSQL中可以不必建專門的降序索引了。
F. postgresql清除緩存會不會影響數據
不會影響資料庫中的數據。
G. postgre 存儲過程怎麼刪除
下載軟體、文件過多;使用過程中產生的緩存數據堆積而不清理。就會導致手機存儲空間不足。
可使用騰訊手機管家,來深度清理垃圾,釋放空間。
使手機不再卡慢。它能清理、垃圾文件、緩存文件垃圾、軟體使用垃圾,微信垃圾。
和軟體卸載殘留垃圾及沒有用的安裝包等
H. mysql和postgresql哪個占內存
特性 MySQL PostgreSQL
實例 通過執行 MySQL 命令(mysqld)啟動實例。一個實例可以管理一個或多個資料庫。一台伺服器可以運行多個 mysqld 實例。一個實例管理器可以監視 mysqld 的各個實例。
通過執行 Postmaster 進程(pg_ctl)啟動實例。一個實例可以管理一個或多個資料庫,這些資料庫組成一個集群。集群是磁碟上的一個區域,這個區域在安裝時初始化並由一個目錄組成,所有數據都存儲在這個目錄中。使用 initdb 創建第一個資料庫。一台機器上可以啟動多個實例。
資料庫 資料庫是命名的對象集合,是與實例中的其他資料庫分離的實體。一個 MySQL 實例中的所有資料庫共享同一個系統編目。 資料庫是命名的對象集合,每個資料庫是與其他資料庫分離的實體。每個資料庫有自己的系統編目,但是所有資料庫共享 pg_databases。
數據緩沖區 通過 innodb_buffer_pool_size 配置參數設置數據緩沖區。這個參數是內存緩沖區的位元組數,InnoDB 使用這個緩沖區來緩存表的數據和索引。在專用的資料庫伺服器上,這個參數最高可以設置為機器物理內存量的 80%。 Shared_buffers 緩存。在默認情況下分配 64 個緩沖區。默認的塊大小是 8K。可以通過設置 postgresql.conf 文件中的 shared_buffers 參數來更新緩沖區緩存。
資料庫連接 客戶機使用 CONNECT 或 USE 語句連接資料庫,這時要指定資料庫名,還可以指定用戶 id 和密碼。使用角色管理資料庫中的用戶和用戶組。 客戶機使用 connect 語句連接資料庫,這時要指定資料庫名,還可以指定用戶 id 和密碼。使用角色管理資料庫中的用戶和用戶組。
身份驗證 MySQL 在資料庫級管理身份驗證。 基本只支持密碼認證。 PostgreSQL 支持豐富的認證方法:信任認證、口令認證、Kerberos 認證、基於 Ident 的認證、LDAP 認證、PAM 認證
加密 可以在表級指定密碼來對數據進行加密。還可以使用 AES_ENCRYPT 和 AES_DECRYPT 函數對列數據進行加密和解密。可以通過 SSL 連接實現網路加密。 可以使用 pgcrypto 庫中的函數對列進行加密/解密。可以通過 SSL 連接實現網路加密。
審計 可以對 querylog 執行 grep。 可以在表上使用 PL/pgSQL 觸發器來進行審計。
查詢解釋 使用 EXPLAIN 命令查看查詢的解釋計劃。 使用 EXPLAIN 命令查看查詢的解釋計劃。
備份、恢復和日誌 InnoDB 使用寫前(write-ahead)日誌記錄。支持在線和離線完全備份以及崩潰和事務恢復。需要第三方軟體才能支持熱備份。 在數據目錄的一個子目錄中維護寫前日誌。支持在線和離線完全備份以及崩潰、時間點和事務恢復。 可以支持熱備份。
JDBC 驅動程序 可以從 參考資料 下載 JDBC 驅動程序。 可以從 參考資料 下載 JDBC 驅動程序。
表類型 取決於存儲引擎。例如,NDB 存儲引擎支持分區表,內存引擎支持內存表。 支持臨時表、常規表以及范圍和列表類型的分區表。不支持哈希分區表。 由於PostgreSQL的表分區是通過表繼承和規則系統完成了,所以可以實現更復雜的分區方式。
索引類型 取決於存儲引擎。MyISAM:BTREE,InnoDB:BTREE。 支持 B-樹、哈希、R-樹和 Gist 索引。
約束 支持主鍵、外鍵、惟一和非空約束。對檢查約束進行解析,但是不強制實施。 支持主鍵、外鍵、惟一、非空和檢查約束。
存儲過程和用戶定義函數 支持 CREATE PROCEDURE 和 CREATE FUNCTION 語句。存儲過程可以用 SQL 和 C++ 編寫。用戶定義函數可以用 SQL、C 和 C++ 編寫。 沒有單獨的存儲過程,都是通過函數實現的。用戶定義函數可以用 PL/pgSQL(專用的過程語言)、PL/Tcl、PL/Perl、PL/Python 、SQL 和 C 編寫。
觸發器 支持行前觸發器、行後觸發器和語句觸發器,觸發器語句用過程語言復合語句編寫。 支持行前觸發器、行後觸發器和語句觸發器,觸發器過程用 C 編寫。
系統配置文件 my.conf Postgresql.conf
資料庫配置 my.conf Postgresql.conf
客戶機連接文件 my.conf pg_hba.conf
XML 支持 有限的 XML 支持。 有限的 XML 支持。
數據訪問和管理伺服器 OPTIMIZE TABLE —— 回收未使用的空間並消除數據文件的碎片
myisamchk -analyze —— 更新查詢優化器所使用的統計數據(MyISAM 存儲引擎)
mysql —— 命令行工具
MySQL Administrator —— 客戶機 GUI 工具 Vacuum —— 回收未使用的空間
Analyze —— 更新查詢優化器所使用的統計數據
psql —— 命令行工具
pgAdmin —— 客戶機 GUI 工具
並發控制 支持表級和行級鎖。InnoDB 存儲引擎支持 READ_COMMITTED、READ_UNCOMMITTED、REPEATABLE_READ 和 SERIALIZABLE。使用 SET TRANSACTION ISOLATION LEVEL 語句在事務級設置隔離級別。 支持表級和行級鎖。支持的 ANSI 隔離級別是 Read Committed(默認 —— 能看到查詢啟動時資料庫的快照)和 Serialization(與 Repeatable Read 相似 —— 只能看到在事務啟動之前提交的結果)。使用 SET TRANSACTION 語句在事務級設置隔離級別。使用 SET SESSION 在會話級進行設置。
I. SqlSugar怎樣適配pgsql
連接資料庫 ThinkPHP內置了抽象資料庫訪問層,把不同的資料庫操作封裝起來,我們只需要使用公共的Db類進行操作,而無需針對不同的資料庫寫不同的代碼和底層實現,Db類會自動調用相應的資料庫適配器來處理。目前的資料庫包括Mysql、MsSQL、PgSQL、Sqlite、Oracle、Ibase以及PDO的支持,如果應用需要使用資料庫,必須配置資料庫連接信息,資料庫的配置文件有多種定義方式:
第一種 在項目配置文件裡面定義
return array(
'DB_TYPE'=> 'mysql',
'DB_HOST'=> 'localhost',
'DB_NAME'=>'thinkphp',
'DB_USER'=>'root',
'DB_PWD'=>'',
'DB_PORT'=>'3306',
'DB_PREFIX'=>'think_',
// 其他項目配置參數………
);
系統推薦使用該種方式,因為一般一個項目的資料庫訪問配置是相同的。該方法系統在連接資料庫的時候會自動獲取,無需手動連接。
可以對每個項目定義不同的資料庫連接信息,還可以在調試配置文件(Conf/debug.php)裡面定義調試資料庫的配置信息,如果在項目配置文件和調試模式配置文件裡面同時定義了資料庫連接信息,那麼在調試模式下面後者生效,部署模式下面前者生效。
第二種 使用DSN方式在初始化Db類的時候傳參數
$db_dsn = 「mysql://username:passwd@localhost:3306/DbName」;
$db = new Db($db_dsn);
該方式主要用於在控制器裡面自己手動連接資料庫的情況,或者用於創建多個資料庫連接。
第三種 使用數組傳參數
$DSN = array(
'dbms' => 'mysql',
'username' => 'username',
'password' => 'password',
'hostname' => ; 'localhost',
'hostport' => '3306',
'database' => 'dbname'
);
$db = new Db($DSN);
該方式也是用於手動連接資料庫的情況,或者用於創建多個資料庫連接。
第四種 在模型類裡面定義
protected $connection = array(
'dbms' => 'mysql',
'username' => 'username',
'password' => 'password',
'hostname' => 'localhost',
'hostport' => '3306',
'database' => 'dbname'
);
// 或者使用下面的定義
protected $connection = 」mysql://username:passwd@localhost:3306/DbName」;
如果在某個模型類裡面定義了connection屬性,則在實例化模型對象的時候,會使用該資料庫連接信息進行資料庫連接。通常用於某些數據表位於當前資料庫連接之外的其它資料庫。
ThinkPHP並不是在一開始就會連接資料庫,而是在有數據查詢操作的時候才會去連接資料庫。額外的情況是,在系統第一次操作模型的時候,框架會自動連接資料庫獲取相關模型類的數據欄位信息,並緩存下來。
(欄位緩存目錄:Runtime/Data/_fields)
ThinkPHP支持PDO方式,如果要使用PDO方式連接資料庫,可以參考下面的設置。
我們以項目配置文件定義為例來說明:
return array(
'DB_TYPE'=> 'pdo',
// 注意DSN的配置針對不同的資料庫有所區別 請參考PHP手冊PDO類庫部分
'DB_DSN'=> 'mysql:host=localhost;dbname=think',
'DB_USER'=>'root',
'DB_PWD'=>'',
'DB_PREFIX'=>'think_',
// 其他項目配置參數………
);
使用PDO方式的時候,要注意檢查是否開啟相關的PDO模塊。DB_DSN參數僅對PDO方式連接才有效。