❶ 千萬級別以上的資料庫如何去優化
第一優化你的sql和索引;
第二加緩存,memcached,redis;
第三以上都做了後,還是慢,就做主從復制或主主復制,讀寫分離,可以在應用層做,效率高,也可以用三方工具,第三方工具推薦360的atlas,其它的要麼效率不高,要麼沒人維護;
第四如果以上都做了還是慢,不要想著去做切分,mysql自帶分區表,先試試這個,對你的應用是透明的,無需更改代碼,但是sql語句是需要針對分區表做優化的,sql條件中要帶上分區條件的列,從而使查詢定位到少量的分區上,否則就會掃描全部分區,另外分區表還有一些坑,在這里就不多說了;
第五如果以上都做了,那就先做垂直拆分,其實就是根據你模塊的耦合度,將一個大的系統分為多個小的系統,也就是分布式系統;
第六才是水平切分,針對數據量大的表,這一步最麻煩,最能考驗技術水平,要選擇一個合理的sharding key,為了有好的查詢效率,表結構也要改動,做一定的冗餘,應用也要改,sql中盡量帶sharding key,將數據定位到限定的表上去查,而不是掃描全部的表;
mysql資料庫一般都是按照這個步驟去演化的,成本也是由低到高。
❷ 網站訪問量大 怎樣優化mysql資料庫
I 硬體配置優化
CPU選擇:多核的CPU,主頻高的CPU
內存:更大的內存
磁碟選擇:更快的轉速、RAID、陣列卡,
網路環境選擇:盡量部署在區域網、SCI、光纜、千兆網、雙網線提供冗餘、0.0.0.0多埠綁定監聽
II 操作系統級優化
使用64位的操作系統,更好的使用大內存。
設置noatime,nodiratime
[zhangxy@dowload_server1 ~]$ cat /etc/fstab
LABEL=/ / ext3 defaults,noatime,nodiratime 1 1
/dev/sda5 /data xfs defaults,noatime,nodiratime 1 2
優化內核參數
net.ipv4.tcp_keepalive_time=7200
net.ipv4.tcp_max_syn_backlog=1024
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.neigh.default.gc_thresh3 = 2048
net.ipv4.neigh.default.gc_thresh2 = 1024
net.ipv4.neigh.default.gc_thresh1 = 256
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.forwarding = 1
net.ipv4.conf.default.proxy_arp = 0
net.ipv4.tcp_syncookies = 1
net.core.netdev_max_backlog = 2048
net.core.dev_weight = 64
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_rfc1337 = 1
net.ipv4.tcp_sack = 0
net.ipv4.tcp_fin_timeout = 20
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_max_orphans = 32768
net.core.optmem_max = 20480
net.core.rmem_default = 16777216
net.core.rmem_max = 16777216
net.core.wmem_default = 16777216
net.core.wmem_max = 16777216
net.core.somaxconn = 500
net.ipv4.tcp_orphan_retries = 1
net.ipv4.tcp_max_tw_buckets = 18000
net.ipv4.ip_forward = 0
net.ipv4.conf.default.proxy_arp = 0
net.ipv4.conf.all.rp_filter = 1
kernel.sysrq = 1
net.ipv4.conf.default.send_redirects = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.ip_local_port_range = 5000 65000
kernel.shmmax = 167108864
vm.swappiness=0
加大文件描述符限制
Vim /etc/security/limits.conf
加上
* soft nofile 65535
* hard nofile 65535
文件系統選擇 xfs
/dev/sda5 /data xfs defaults,noatime,nodiratime 1 2
III Mysql設計優化
III.1存儲引擎的選擇
Myisam:資料庫並發不大,讀多寫少,而且都能很好的用到索引,sql語句比較簡單的應用,TB數據倉庫
Innodb:並發訪問大,寫操作比較多,有外鍵、事務等需求的應用,系統內存較大。
III.2命名規則
多數開發語言命名規則:比如MyAdress
多數開源思想命名規則:my_address
避免隨便命名
III.3欄位類型選擇
欄位類型的選擇的一般原則:
根據需求選擇合適的欄位類型,在滿足需求的情況下欄位類型盡可能小。
只分配滿足需求的最小字元數,不要太慷慨。
原因:更小的欄位類型更小的字元數佔用更少的內存,佔用更少的磁碟空間,佔用更少的磁碟IO,以及佔用更少的帶寬。
III.3.1 整型:
見如下圖:
類型
位元組
最小值
最大值
(帶符號的/無符號的)
(帶符號的/無符號的)
TINYINT
1
-128
127
0
255
SMALLINT
2
-32768
32767
0
65535
MEDIUMINT
3
-8388608
8388607
0
16777215
INT
4
-2147483648
2147483647
0
4294967295
BIGINT
8
-9223372036854775808
9223372036854775807
0
18446744073709551615
根據滿足需求的最小整數為選擇原則,能用INT的就不要用BIGINT。
用無符號INT存儲IP,而非CHAR(15)。
III.3.2 浮點型:
類型
位元組
精度類型
使用場景
FLOAT(M,D)
4
單精度
精度要求不高,數值比較小
DOUBLE(M,D)(REAL)
8
雙精度
精度要求不高,數值比較大
DECIMAL(M,D)(NUMERIC)
M+2
自定義精度
精度要求很高的場景
III.3.3 時間類型
類型
取值范圍
存儲空間
零值表示法
DATE
1000-01-01~9999-12-31
3位元組
0000-00-00
TIME
-838:59:59~838:59:59
3位元組
00:00:00
DATETIME
1000-01-01 00:00:00~9999-12-31 23:59:59
8位元組
0000-00-00 00:00:00
TIMESTAMP
19700101000000~2037年的某個時刻
4位元組
00000000000000
YEAR
YEAR(4):1901~2155 YEAR(2):1970~2069
1位元組
0000
III.3.4 字元類型
類型
最大長度
佔用存儲空間
CHAR[(M)]
M位元組
M位元組
VARCHAR[(M)]
M位元組
M+1位元組
TINYBLOD,TINYTEXT
2^8-1位元組
L+1位元組
BLOB,TEXT
2^16-1位元組
L+2
MEDIUMBLOB,MEDIUMTEXT
2^24-1位元組
L+3
LONGBLOB,LONGTEXT
2^32-1位元組
L+4
ENUM('value1','value2',...)
65535個成員
1或2位元組
SET('value1','value2',...)
64個成員
1,2,3,4或8位元組
註:L表示可變長度的意思
對於varchar和char的選擇要根據引擎和具體情況的不同來選擇,主要依據如下原則:
1. 如果列數據項的大小一致或者相差不大,則使用char。
2. 如果列數據項的大小差異相當大,則使用varchar。
3. 對於MyISAM表,盡量使用Char,對於那些經常需要修改而容易形成碎片的myisam和isam數據表就更是如此,它的缺點就是佔用磁碟空間。
4. 對於InnoDB表,因為它的數據行內部存儲格式對固定長度的數據行和可變長度的數據行不加區分(所有數據行共用一個表頭部分,這個標頭部分存放著指向各有關數據列的指針),所以使用char類型不見得會比使用varchar類型好。事實上,因為char類型通常要比varchar類型佔用更多的空 間,所以從減少空間佔用量和減少磁碟i/o的角度,使用varchar類型反而更有利。
5. 表中只要存在一個varchar類型的欄位,那麼所有的char欄位都會自動變成varchar類型,因此建議定長和變長的數據分開。
III.4編碼選擇
單位元組 latin1
多位元組 utf8(漢字佔3個位元組,英文字母佔用一個位元組)
如果含有中文字元的話最好都統一採用utf8類型,避免亂碼的情況發生。
III.5主鍵選擇原則
註:這里說的主鍵設計主要是針對INNODB引擎
1. 能唯一的表示行。
2. 顯式的定義一個數值類型自增欄位的主鍵,這個欄位可以僅用於做主鍵,不做其他用途。
3. MySQL主鍵應該是單列的,以便提高連接和篩選操作的效率。
4. 主鍵欄位類型盡可能小,能用SMALLINT就不用INT,能用INT就不用BIGINT。
5. 盡量保證不對主鍵欄位進行更新修改,防止主鍵欄位發生變化,引發數據存儲碎片,降低IO性能。
6. MySQL主鍵不應包含動態變化的數據,如時間戳、創建時間列、修改時間列等。
7. MySQL主鍵應當有計算機自動生成。
8. 主鍵欄位放在數據表的第一順序。
推薦採用數值類型做主鍵並採用auto_increment屬性讓其自動增長。
III.6其他需要注意的地方
NULL OR NOT NULL
盡可能設置每個欄位為NOT NULL,除非有特殊的需求,原因如下:
1. 使用含有NULL列做索引的話會佔用更多的磁碟空間,因為索引NULL列需要而外的空間來保存。
2. 進行比較的時候,程序會更復雜。
3. 含有NULL的列比較特殊,SQL難優化,如果是一個組合索引,那麼這個NULL 類型的欄位會極大影響整個索引的效率。
索引
索引的缺點:極大地加速了查詢,減少掃描和鎖定的數據行數。
索引的缺點:佔用磁碟空間,減慢了數據更新速度,增加了磁碟IO。
添加索引有如下原則:
1. 選擇唯一性索引。
2. 為經常需要排序、分組和聯合操作的欄位建立索引。
3. 為常作為查詢條件的欄位建立索引。
4. 限制索引的數據,索引不是越多越好。
5. 盡量使用數據量少的索引,對於大欄位可以考慮前綴索引。
6. 刪除不再使用或者很少使用的索引。
7. 結合核心SQL優先考慮覆蓋索引。
8. 忌用字元串做主鍵。
反範式設計
適當的使用冗餘的反範式設計,以空間換時間有的時候會很高效。
IV Mysql軟體優化
開啟mysql復制,實現讀寫分離、負載均衡,將讀的負載分攤到多個從伺服器上,提高伺服器的處理能力。
使用推薦的GA版本,提升性能
利用分區新功能進行大數據的數據拆分
V Mysql配置優化
注意:全局參數一經設置,隨伺服器啟動預佔用資源。
key_buffer_size參數
mysql索引緩沖,如果是採用myisam的話要重點設置這個參數,根據(key_reads/key_read_requests)判斷
innodb_buffer_pool_size參數
INNODB 數據、索引、日誌緩沖最重要的引擎參數,根據(hit riatos和FILE I/O)判斷
wait_time_out參數
線程連接的超時時間,盡量不要設置很大,推薦10s
max_connections參數
伺服器允許的最大連接數,盡量不要設置太大,因為設置太大的話容易導致內存溢出,需要通過如下公式來確定:
SET @k_bytes = 1024;
SET @m_bytes = @k_bytes * 1024;
SET @g_bytes = @m_bytes * 1024;
SELECT
(
@@key_buffer_size + @@query_cache_size + @@tmp_table_size+
@@innodb_buffer_pool_size + @@innodb_additional_mem_pool_size+
@@innodb_log_buffer_size+
@@max_connections *
( @@read_buffer_size + @@read_rnd_buffer_size + @@sort_buffer_size+
@@join_buffer_size + @@binlog_cache_size + @@thread_stack
) )
/ @g_bytes AS MAX_MEMORY_USED_GB;
thread_concurrency參數
線程並發利用數量,(cpu+disk)*2,根據(os中顯示的請求隊列和tickets)判斷
sort_buffer_size參數
獲得更快的--ORDER BY,GROUP BY,SELECT DISTINCT,UNION DISTINCT
read_rnd_buffer_size參數
當根據鍵進行分類操作時獲得更快的--ORDER BY
join_buffer_size參數
join連接使用全表掃描連接的緩沖大小,根據select_full_join判斷
read_buffer_size參數
全表掃描時為查詢預留的緩沖大小,根據select_scan判斷
tmp_table_size參數
臨時內存表的設置,如果超過設置就會轉化成磁碟表,根據參數(created_tmp_disk_tables)判斷
innodb_log_file_size參數(默認5M)
記錄INNODB引擎的redo log文件,設置較大的值意味著較長的恢復時間。
Ø innodb_flush_method參數(默認fdatasync)
Linux系統可以使用O_DIRECT處理數據文件,避免OS級別的cache,O_DIRECT模式提高數據文件和日誌文件的IO提交性能
innodb_flush_log_at_trx_commit(默認1)
表示每秒進行一次log寫入cache,並flush log到磁碟。
表示在每次事務提交後執行log寫入cache,並flush log到磁碟。
表示在每次事務提交後,執行log數據寫入到cache,每秒執行一次flush log到磁碟。
VI Mysql語句級優化
1. 性能查的讀語句,在innodb中統計行數,建議另外弄一張統計表,採用myisam,定期做統計.一般的對統計的數據不會要求太精準的情況下適用。
2. 盡量不要在資料庫中做運算。
3. 避免負向查詢和%前綴模糊查詢。
4. 不在索引列做運算或者使用函數。
5. 不要在生產環境程序中使用select * from 的形式查詢數據。只查詢需要使用的列。
6. 查詢盡可能使用limit減少返回的行數,減少數據傳輸時間和帶寬浪費。
7. where子句盡可能對查詢列使用函數,因為對查詢列使用函數用不到索引。
8. 避免隱式類型轉換,例如字元型一定要用』』,數字型一定不要使用』』。
9. 所有的SQL關鍵詞用大寫,養成良好的習慣,避免SQL語句重復編譯造成系統資源的浪費。
10. 聯表查詢的時候,記得把小結果集放在前面,遵循小結果集驅動大結果集的原則。
11. 開啟慢查詢,定期用explain優化慢查詢中的SQL語句。
❸ oracle資料庫的性能優化有哪些方法
你最好買一本專門講ORACLE性能優化的書,好好看看\x0d\x0a1、調整資料庫伺服器的性能\x0d\x0aOracle資料庫伺服器是整個系統的核心,它的性能高低直接影響整個系統的性能,為了調整Oracle資料庫伺服器的性能,主要從以下幾個方面考慮: \x0d\x0a1.1、調整操作系統以適合Oracle資料庫伺服器運行\x0d\x0aOracle資料庫伺服器很大程度上依賴於運行伺服器的操作系統,如果操作系統不能提供最好性能,那麼無論如何調整,Oracle資料庫伺服器也無法發揮其應有的性能。 \x0d\x0a1.1.1、為Oracle資料庫伺服器規劃系統資源 \x0d\x0a據已有計算機可賀察裂用資源, 規劃分配給Oracle伺服器資源原則是:盡可能使Oracle伺服器使用資源最大化,特別在Client/Server中盡量讓伺服器上所有資源都來運行Oracle服務。 \x0d\x0a1.1.2、調整計算機系統中的內存配置 \x0d\x0a多數操作系統都用虛存來模擬計算機上更大的內存,它實際上是硬碟上的一定的磁碟空間。當實際的內存空間不能滿足應用軟體的要求時,操作系統就將用這部分的磁碟空間對內存中的信息進行頁面替換,這將引起大量的磁碟I/O操作,使整個伺服器的性能下降。為了避免過多地使用虛存,應加大計算機的內存。 \x0d\x0a1.1.3、為Oracle資料庫伺服器設置操作系統進程優先順序 \x0d\x0a不要在操作系統中調整Oracle進程的優先順序,因為在Oracle資料庫系統中,所有的後台和前台資料庫伺服器進程執行的是同等重要的工作,需要同等的優先順序。所以在安裝時,讓所有的資料庫伺服器進程都使用預設的優先順序運行。 \x0d\x0a1.2、調整內存分配\x0d\x0aOracle資料庫伺服器保留3個基本的內存高速緩存,分別對應3種不同類型的數據:庫高速緩存,字典高速緩存和緩沖區高速緩存。庫高速緩存和字典高速緩存一起構成共享池,共享池再加上緩沖區高速緩存便構成了系統全程區(SGA)。SGA是對資料庫數據進行快速訪問的一個系統全程區,若SGA本身需要頻繁地進行釋放、分配,則不能達到快速訪問數據的目的,因此應把SGA放在主存中,不要放在虛擬內存中。內存的調整主要是指調整組成SGA的內存結構沒斗的大小來提高系統性能,由於Oracle資料庫伺服器的內存結構需求與應用密切相關,所以內存結構的調整應在磁碟I/O調整之前進行。 \x0d\x0a1.2.1、庫緩沖區的調整 \x0d\x0a庫緩沖區中包含私用和共享SQL和PL/SQL區,通過比較庫緩沖區的命中率決定它的大小。要調整庫緩沖區,必須首先了解該庫緩沖區的活動情況,庫緩沖區的活動統計信息保留在動態性能表v$librarycache數據字典中,可通過查詢該表來了解其活動情況,以決定如何調整。 \x0d\x0a \x0d\x0aSelect sum(pins),sum(reloads) from v$librarycache; \x0d\x0a \x0d\x0aPins列給出SQL語句,PL/SQL塊及被訪問對象定義的總次數;Reloads列給出SQL 和PL/SQL塊的隱式分析或對象定義重裝載時在庫程序緩沖區中發生的錯誤。如果sum(pins)/sum(reloads) ≈0,則庫緩沖區的命中率合適;若sum(pins)/sum(reloads)>1, 則需調整初始化參數 shared_pool_size來重新調整分配給共享禪閉池的內存量。 \x0d\x0a1.2.2、數據字典緩沖區的調整 \x0d\x0a數據字典緩沖區包含了有關資料庫的結構、用戶、實體信息。數據字典的命中率,對系統性能影響極大。數據字典緩沖區的使用情況記錄在動態性能表v$librarycache中,可通過查詢該表來了解其活動情況,以決定如何調整。 \x0d\x0a \x0d\x0aSelect sum(gets),sum(getmisses) from v$rowcache; \x0d\x0a \x0d\x0aGets列是對相應項請求次數的統計;Getmisses 列是引起緩沖區出錯的數據的請求次數。對於頻繁訪問的數據字典緩沖區,sum(getmisses)/sum(gets)<10%~15%。若大於此百分數,則應考慮增加數據字典緩沖區的容量,即需調整初始化參數shared_pool_size來重新調整分配給共享池的內存量。 \x0d\x0a1.2.3、緩沖區高速緩存的調整 \x0d\x0a用戶進程所存取的所有數據都是經過緩沖區高速緩存來存取,所以該部分的命中率,對性能至關重要。緩沖區高速緩存的使用情況記錄在動態性能表v$sysstat中,可通過查詢該表來了解其活動情況,以決定如何調整。 \x0d\x0a \x0d\x0aSelect name,value from v$sysstat where name in ('dbblock gets','consistent gets','physical reads'); \x0d\x0a \x0d\x0adbblock gets和consistent gets的值是請求數據緩沖區中讀的總次數。physical reads的值是請求數據時引起從盤中讀文件的次數。從緩沖區高速緩存中讀的可能性的高低稱為緩沖區的命中率,計算公式: \x0d\x0a \x0d\x0aHit Ratio=1-(physical reds/(dbblock gets+consistent gets)) \x0d\x0a \x0d\x0a如果Hit Ratio<60%~70%,則應增大db_block_buffers的參數值。db_block_buffers可以調整分配給緩沖區高速緩存的內存量,即db_block_buffers可設置分配緩沖區高速緩存的數據塊的個數。緩沖區高速緩存的總位元組數=db_block_buffers的值*db_block_size的值。db_block_size 的值表示數據塊大小的位元組數,可查詢 v$parameter 表: \x0d\x0a \x0d\x0aselect name,value from v$parameter where name='db_block_size'; \x0d\x0a \x0d\x0a在修改了上述資料庫的初始化參數以後,必須先關閉資料庫,在重新啟動資料庫後才能使新的設置起作用。
❹ 怎麼進行mysql資料庫優化(mysql資料庫優化的幾種方法)
主要從以下角度思考優化方向:1,Mysql配置優化主要對查詢緩存,mysql資料庫連接時緩賣長,開啟慢查詢日誌(開啟後還要分析sql)等方面進行優化2
Myslq語句優化3
Mysql索引優化主要是需要注意索引數量和索引失效情況,重復索引橡哪桐4
Mysql引擎優化innodb引擎注重於事務,能保證數據一致性myisam引擎梁坦可以進行全文檢索,但不是事務安全當初在黑馬程序員學過,還用實例進行優化學習
❺ MySQL資料庫優化(七)
為了能最小化磁碟I/O MyISAM 存儲引擎採用了很多資料庫系統使用的一種策略 它採用一種機制將最經常訪問的表保存在內存區塊中
對索引區塊來說 它維護著一個叫索引緩存(索引緩沖)的結構體 這個結構體中放著許多那些最常使用的索引區塊的緩沖區塊 對數據區塊來說 MySQL沒有使用特定的緩存 它依靠操作系統的本地文件系統緩存本章首先描述了 MyISAM 索引緩存的基本操作 然後討論在MySQL 中所做的改進 它提高了索引緩存性能 同時能更好地控制緩存操作
線程之間不再是串列地訪問索引緩存 多個線程可以並行地訪問索引緩存 可以設置多個索引緩存 同時也能指定數據表索引到特定的緩存中索引緩存機制對 ISAM 表同樣適用 不過 這種有效性正在減弱 自從MySQL 開始 MyISAM 表類型引進之後 ISAM 就不再建議使用了 MySQL 更是延續了這個趨勢 ISAM 類型默認被禁用了
可以通過系統變數 key_buffer_size 來控制索引緩存區塊的大小 如果這個值大小為 那麼就不使用緩存 當這個值小得於不足以分配區塊緩沖的最小數量( )時 也不會使用緩存
當索引緩存無法操作時 索引文件就只通過操作系統提供的本地文件系統緩沖來訪問(換言之 表索引區塊採用的訪問策略和數據區塊的一致)
一個索引區塊在 MyISAM 索引文件中數純升是一個連續訪問的單元 通常這個索引區塊的大小和B樹索引節點大小一樣薯老(索引在磁碟中是以B樹結構來表示的 這個樹的底部時葉子節點 葉子節點之上則是非葉子節點)
在索引緩存結構中所有的區塊大小都是一樣的 這個值可能等於 大於 或小於表的索引區塊大小 通常這兩個值是不一樣的
當必須訪問來自任何錶的索引區塊時 伺服器首先檢查在索引緩存中是否有可用的緩沖區塊 如果有 伺服器就訪問緩存中的數據 而非磁碟 就是說 它直接存取緩存 而不是存取磁碟 否則 伺服器選擇一個(多個)包含其它不同表索引區塊的緩存緩沖區塊 將它的內容替換成請求表的索引區塊的拷貝 一旦新的索引區塊在緩存中了 索引數據就可以存取了
當發生被選中要替換的區塊內容修改了的情況時 這個區塊就被認為 臟 了 那麼 在替換之前 它的內容就必須先刷新到它指向的標索引
通常伺服器遵循LRU(最近最少使用)策略 當要選擇替換的區塊時 它選擇最近最少使用的索引區塊 為了想要讓選擇變得更容易 索引緩存模塊會維護一個包含所有使用區塊特別的隊列(LRU鏈) 當一個區塊被訪問了 就把它放到隊列的最後位置 當區塊要被替換時 在隊列開始位置的區塊就是最近最少使用的 它就是第一候選刪除對象
共享訪問索引緩存
在MySQL 以前 訪問索引緩存是串列的 兩個線程不能並行地訪問索引緩存緩沖 伺服器處理一個訪問索引區塊的請求只能等它之前的請求處理完 結果 新的請求所需的索引區塊就不在任何索引緩存環沖區塊中 因為其他線程把包含這個索引區塊的緩沖給更新了
從MySQL 開始 伺服器支持共享方式訪問索引緩存
沒有正在被更新的緩沖可以被多個線程訪問
緩沖正被更新時 需要使用這個緩沖的線程只能等到更新完成之後
多個線程可以初始化需要替換緩存區塊的請求 只要它們不幹擾別的線程(也就是 它們請求不同的索引區塊 因此不同的緩存區塊被替換)
共享方式訪問索引緩存令伺服器明顯改善了吞吐量
多重索引緩存
共享訪問索引緩存改善了性能 卻不能完全消褲尺除線程間的沖突 它們仍然爭搶控制管理存取索引緩存緩沖的結構 為了更進一步減少索引緩存存取沖突 MySQL 提供了多重索引緩存特性 這能將不同的表索引指定到不同的索引緩存
當有多個索引緩存 伺服器在處理指定的 MyISAM 表查詢時必須知道該使用哪個 默認地 所有的 MyISAM 表索引都緩存在默認的索引緩存中 想要指定到特定的緩存中 可以使用 CACHE INDEX 語句
如下語句所示 指定表的索 t t 和 t 引緩存到名為 hot_cache 的緩存中
mysql>CACHEINDEXt t t INhot_cache; + + + + + |Table|Op|Msg_type|Msg_text| + + + + + |test t |assign_to_keycache|status|OK| |test t |assign_to_keycache|status|OK| |test t |assign_to_keycache|status|OK| + + + + +
注意 如果伺服器編譯支持存 ISAM 儲引擎了 那麼 ISAM 表也使用索引緩存機制 不過 ISAM 表索引只能使用默認的索引緩存而不能自定義
CACHE INDEX 語句中用到的索引緩存是根據用 SET GLOBAL 語句的參數設定的值或者伺服器啟動參數指定的值創建的 如下 mysql> SET GLOBAL keycache key_buffer_size= * ;想要刪除索引緩存 只需設置它的大小為 mysql> SET GLOBAL keycache key_buffer_size= ;索引緩存變數是一個結構體變數 由名字和組件構成 例如 keycache key_buffer_size keycache 就是緩存名 key_buffer_size 是緩存組件 默認地 表索引在伺服器啟動時指定到主(默認的)索引緩存中 當一個索引緩存被刪掉後 指定到這個緩存的所有索引都被重新指向到了默認索引緩存中去 對一個繁忙的系統來說 我們建議以下三條策略來使用索引緩存 熱緩存佔用 %的總緩存空間 用於繁重搜索但很少更新的表 冷緩存佔用 %的總緩存空間 用於中等強度更新的表 如臨時表 冷緩存佔用 %的總緩存空間 作為默認的緩存 用於所有其他表 使用三個緩存的一個原因是好處在於 存取一個緩存結構時不會阻止對其他緩存的訪問 訪問一個表索引的查詢不會跟指定到其他緩存的查詢競爭 性能提高還表現在以下幾點原因 熱緩存只用於檢索記錄 因此它的內容總是不需要變化 所以 無論什麼時候一個索引區塊需要從磁碟中引入 被選中要替換的緩存區塊的內容總是要先被刷新 索引被指向熱緩存中後 如果沒有需要掃描全部索引的查詢 那麼對應到B樹中非葉子節點的索引區塊極可能還保留在緩存中 在臨時表裡必須頻繁執行一個更新操作是相當快的 如果要被更新的節點已經在緩存中了 它無需先從磁碟中讀取出來 當臨時表的索引大小和冷緩存大小一樣時 那麼在需要更新一個節點時它已經在緩存中存在的幾率是相當高的
中點插入策略
默認地 MySQL 的索引緩存管理系統採用LRU策略來選擇要被清除的緩存區塊 不過它也支持更完善的方法 叫做 中點插入策略
使用中點插入策略時 LRU鏈就被分割成兩半 一個熱子鏈 一個溫子鏈 兩半分割的點不是固定的 不過緩存管理系統會注意不讓溫子鏈部分 太短 總是至少包括全部緩存區塊的 key_cache_division_limit 比率 key_cache_division_limit 是緩存結構體變數的組件部分 因此它是每個緩存都可以設置這個參數值
當一個索引區塊從表中讀入緩存時 它首先放在溫子鏈的末尾 當達到一定的點擊率(訪問這個區塊)後 它就提升到熱子鏈中去 目前 要提升一個區塊的點擊率( )對每個區塊來說都是一樣的 將來 我們會讓點擊率依靠B樹中對應的索引區塊節點的級別 包含非葉子節點的索引區塊所要求的提升點擊率就低一點 包含葉子節點的B索引樹的區塊的值就高點
提升起來的區塊首先放在熱子鏈的末尾 這個區塊在熱子鏈內一直循環 如果這個區塊在該子鏈開頭位置停留時間足夠長了 它就會被降級回溫子鏈 這個時間是由索引緩存結構體變數的組件 key_cache_age_threshold 值來決定的
這個閥值是這么描述的 一個索引緩存包含了 N 個區塊 熱子鏈開頭的區塊在低於 N*key_cache_age_threshold/ 次訪問後就被移動到溫子鏈的開頭位置 它又首先成為被刪除的候選對象 因為要被替換的區塊還是從溫子鏈的開頭位置開始的
中點插入策略就能在緩存中總能保持更有價值的區塊 如果更喜歡採用LRU策略 只需讓 key_cache_division_limit 的值低於默認值
中點插入策略能幫助改善在執行需要有效掃描索引 它會將所有對應到B樹中高級別的有價值的節點推出的查詢時的性能 為了避免這樣 就必須設定 key_cache_division_limit 遠遠低於 以採用中點插入策略 則在掃描索引操作時那些有價值的頻繁點擊的節點就會保留在熱子鏈中了
索引預載入
如果索引緩存中有足夠的區塊用來保存全部索引 或者至少足夠保存全部非葉子節點 那麼在使用前就載入索引緩存就很有意義了 將索引區塊以十分有效的方法預載入索引緩存緩沖 從磁碟中順序地讀取索引區塊
沒有預載入 查詢所需的索引區塊仍然需要被放到緩存中去 雖然索引區塊要保留在緩存中 因為有足夠的緩沖 它們可以從磁碟中隨機讀取到 而非順序地
想要預載入緩存 可以使用 LOAD INDEX INTO CACHE 語句 如下語句預載入了表 t 和 t 的索引節點(區塊)
mysql>LOADINDEXINTOCACHEt t IGNORELEAVES; + + + + + |Table|Op|Msg_type|Msg_text| + + + + + |test t |preload_keys|status|OK| |test t |preload_keys|status|OK| + + + + +
增加修飾語 IGNORE LEAVES 就只預載入非葉子節點的索引區塊 因此 上述語句載入了 t 的全部索引區塊 但是只載入 t 的非葉子節點區塊
如果使用 CACHE INDEX 語句將索引指向一個索引緩存 將索引區塊預先放到那個緩存中去 否則 索引區塊只會載入到默認的緩存中去
索引緩存大小
MySQL 引進了對每個索引緩存的新變數 key_cache_block_size 這個變數可以指定每個索引緩存的區塊大小 用它就可以來調整索引文件I/O操作的性能
當讀緩沖的大小和本地操作系統的I/O緩沖大小一樣時 就達到了I/O操作的最高性能了 但是設置索引節點的大小和I/O緩沖大小一樣未必能達到最好的總體性能 讀比較大的葉子節點時 伺服器會讀進來很多不必要的數據 這大大阻礙了讀其他葉子節點
目前 還不能控制數據表的索引區塊大小 這個大小在伺服器創建索引文件 ` MYI 時已經設定好了 它根據數據表的索引大小的定義而定 在很多時候 它設置成和I/O緩沖大小一樣 在將來 可以改變它的值 並且會全面採用變數 key_cache_block_size
重建索引緩存
索引緩存可以通過修改其參數值在任何時候重建它 例如
mysql>SETGLOBALcold_cache key_buffer_size= * * ;
如果設定索引緩存的結構體變數組件變數 key_buffer_size 或 key_cache_block_size 任何一個的值和它當前的值不一樣 伺服器就會清空原來的緩存 在新的變數值基礎上重建緩存 如果緩存中有任何的 臟 索引塊 伺服器會先把它們保存起來然後才重建緩存 重新設定其他的索引緩存變數並不會重建緩存
lishixin/Article/program/Oracle/201311/16615
❻ 資料庫訪問量很大時,如何做優化
你好!如果有大量的訪問用到調取到資料庫時,往往查詢速度會變得很慢,所以我們需襪裂要進行優化處理。
優化從三個方面考慮:
SQL語句優化、
主從復制,讀寫分離,負載均衡、
資料庫分庫分表。
一、SQL查詢語句優化
1、使用索引
建立索引可以使查詢速度得到提升,我們首先應該考慮在where及orderby,groupby涉及的列上建立索引。
2、藉助explain(查詢優化神器)選擇更好的索引和優化查詢語句
SQL的Explain通過圖形化或基於文本的方式詳細說明了SQL語句的每個部分是如何執行以及何時執行的,以及執行效果。通過對選擇更好的索引列,或者對耗時久的SQL語句進行優化達到對查詢速度的優化。
3、任何地方都不要使用SELECT*FROM語句。
4、不要在索引列做運算或者使用函數
5、查詢盡可能使用limit來減少返回的行數
6、使用查詢緩存,並將盡量多的內存分配給MYSQL做緩存
二、悶談主從復制,讀寫分離,負載均衡
目前大多數的主流關系型資料庫都提供了主從復制的功能,通過配置兩台(或多台)資料庫的主從關系,可以將一台資料庫伺服器的數據更新同步到另一台伺服器上。網站可以利用資料庫這一功能,實現資料庫的讀寫分離,從而改善資料庫的負載壓力。一個系統的讀操作遠遠多於寫操作,因此寫操作發向master,讀操作發向slaves進行操作(簡單的輪詢演算法來決定使用哪個slave)。
利用資料庫的讀寫分離,Web伺服器在寫數據的時候,訪問主資料庫(master),主資料庫通過主從復制將數據更新同步到從資料庫(slave),這樣當Web伺服器讀數據的時候,就可以通過從資料庫獲得數據。這一方案使得在大量讀操作的Web應用可以輕松地讀取數據,而主資料庫也只會承受少量的寫入操作,還可以實現數據熱備份,可謂是一舉兩得。
三、資料庫分表、分區、分庫
1、分表
通過分表可以提高表的訪問效率。有兩種拆分方法:
垂直拆分
在主鍵和一些列放在一個表中,然後把主鍵和另外的列放在另一個表中。如果一個表中某些列常用,而另外一些不常用,則可以採用垂直拆分。
水平拆分
根據一列或者多列數據的值把數據行放到兩個獨立的表中。
2、分區
分區就是把一張表的數據分成多個區塊,這些區塊可以在一個磁碟上,也可以在不同的磁碟上,分區後,表面上還是一張表,但是數據散列在多個位置,這樣一來,多塊硬碟同時處理不同的請求,從而提高磁碟I/O讀寫性能。實現比較簡單,包括水平分區和垂直分區。
3、分庫
分庫是根據業務不同把相關的表切分到不同的資料庫中,比如web、bbs、blog等庫。
分庫解決的是資料庫端並發量的問題。分庫和分表並不一定兩個都要上,比如數據量很大,但是訪問的用戶很少,我們就可以只使用分表不使用分庫。如果數據量只有1萬,而訪問用戶有一千,那就只使用分庫。
注意:分庫分表最難解決的問題是統計,還有跨表的連接(比如螞好碰這個表的訂單在另外一張表),解決這個的方法就是使用中間件,比如大名鼎鼎的MyCat,用它來做路由,管理整個分庫分表,乃至跨庫跨表的連接
❼ 資料庫該如何優化
資料庫優化可以從以下幾個方面進行:
1.結構層: web伺服器採用負載均衡伺服器,mysql伺服器採用主從復制,讀寫分離
2.儲存層: 採用合適的存儲引擎,採用三範式
3.設計層: 採用分區分表,索引,表的欄位採用合適的欄位屬性,適當的採用逆範式,開啟mysql緩存
4.sql語句層:結果一樣的情況下,採用效率高,速度快節省資源的sql語句執行
❽ 淺談資料庫查詢優化的幾種思路
應盡量避免全表掃描,首先應考慮在 where 及 order by ,group by 涉及的列上建立索引
可以幫助選擇更好的索引和優化查詢語句, 寫出更好的優化語句。 通常我們可以對比較復雜的尤其是涉及到多表的 SELECT 語句, 把關鍵字 EXPLAIN 加到前面, 查看執行計劃。例如: explain select * from news;
用具體的欄位列表代替「*」 , 不要返回用不到的任何欄位。
mysql innodb上的理解。
1,不需要的欄位會增加數據傳輸的時間,即使mysql伺服器和客戶端是在同一台機器上,使用的協議還是tcp,通信也是需要額外的時間。
2,要取的欄位、索引的類型,和這兩個也是有關系的。舉個例子,對於user表,有name和phone的聯合索引,select name from user where phone= 12345678912 和 select * from user where phone= 12345678912 ,前者要比後者的速度快,因為name可以在索引上直接拿到,不再需要讀取這條記錄了。
3,大欄位,例如很長的varchar,blob,text。准確來說,長度超過728位元組的時候,會把超出的數據放到另外一個地方,因此讀取這條記錄會增加一次io操作。
比如from_unixtime(create_time) = 』2014-05-29』就不能使用到索引,原因很簡單,b+樹中存的都是數據表中的欄位值,但進行檢索時,需要把所有元素都應用函數才能比較,顯然成本太大。所以語句應該寫成create_time = unix_timestamp(』2014-05-29』);
使用 procere analyse()函數對表進行分析, 該函數可以對表中列的數據類型提出優化建議。 能小就用小。 表數據類型第一個原則是: 使用能正確的表示和存儲數據的最短類型。 這樣可以減少對磁碟空間、 內存、 cpu 緩存的使用。
使用方法: select * from 表名 procere analyse();
通過拆分表可以提高表的訪問效率。 有 2 種拆分方法
1.垂直拆分
把主鍵和一些列放在一個表中, 然後把主鍵和另外的列放在另一個表中。 如果一個表中某些列常用, 而另外一些不常用, 則可以採用垂直拆分。
2.水平拆分
根據一列或者多列數據的值把數據行放到二個獨立的表中。
創建中間表, 表結構和源表結構完全相同, 轉移要統計的數據到中間表, 然後在中間表上進行統計, 得出想要的結果。
選擇多核和主頻高的 CPU。
使用更大的內存。 將盡量多的內存分配給 MYSQL 做緩存。
4.3.1 使用磁碟陣列
RAID 0 沒有數據冗餘, 沒有數據校驗的磁碟陳列。 實現 RAID 0至少需要兩塊以上的硬碟, 它將兩塊以上的硬碟合並成一塊, 數據連續地分割在每塊盤上。
RAID1 是將一個兩塊硬碟所構成 RAID 磁碟陣列, 其容量僅等於一塊硬碟的容量, 因為另一塊只是當作數據「鏡像」。使用 RAID-0+1 磁碟陣列。 RAID 0+1 是 RAID 0 和 RAID 1 的組合形式。 它在提供與 RAID 1 一樣的數據安全保障的同時, 也提供了與 RAID 0 近似的存儲性能。
4.3.2 調整磁碟調度演算法
選擇合適的磁碟調度演算法, 可以減少磁碟的尋道時間
對 MySQL 自身的優化主要是對其配置文件 my.cnf 中的各項參數進行優化調整。 如指定 MySQL 查詢緩沖區的大小, 指定 MySQL 允許的最大連接進程數等。
它的作用是存儲 select 查詢的文本及其相應結果。 如果隨後收到一個相同的查詢, 伺服器會從查詢緩存中直接得到查詢結果。 查詢緩存適用的對象是更新不頻繁的表, 當表中數據更改後, 查詢緩存中的相關條目就會被清空。
❾ mysql資料庫中,數據量很大的表,有什麼優化方案么
個人的觀點,這種大表的優化,不一定上來就要分庫分表,因為表一旦被拆分,開發、運維的復雜度會直線上升,而大多數公司是欠缺這種能力的。所以MySQL中幾百萬甚至小幾千萬的表,先考慮做單表的優化。
單表優化
單表優化可以從這幾個角度出發:
表分區:MySQL在5.1之後才有的,可以看做是水平拆分,分區表需要在建表的需要加上分區參數,用戶需要在建表的時候加上分區參數;分區表底層由多個物理子表組成,但是對於代碼來說,分區表是透明的;SQL中的條件中最好能帶上分區條件的列,這樣可以定位到少量的分區上,否則就會掃描全部分區。
讀寫分離:最常用的櫻桐優化手段,寫主庫讀從庫;
增加緩存:主要的思想就是減少對資料庫的訪問,緩存可以在整個架構中的很多地方,比如:資料庫本身有就緩存,客戶端緩存,資料庫訪問層對SQL語句的緩存,應用程序內的緩存,第三方緩存(如Redis等);
欄位設計:單表不要有太多欄位;VARCHAR的長度盡量只分配真正需要的空間;盡量使用TIMESTAMP而非DATETIME;避免使用NULL,可以通過設置默認值解決。
索引優化:索引不是越多越好,針對性地建立索引,索引會加速查詢,但是對新增、修改、刪除會造成一定的影響;值域很少的欄位不適合建索引;盡量不用UNIQUE,不要設置外鍵,由程序保證;
SQL優化:盡量使用索引,也要保證不要因為錯誤的寫法導致索引失效;比如:避免前導模糊查詢,避免隱式轉換,避免等號左邊做函數運算,in中的元素不宜過多等等;
NoSQL:有一些場景,可以拋棄MySQL等關系型資料庫,擁抱NoSQL;比如:統計類、日誌類、弱結構化的數據;事務要求低的場景。
表拆分
數據量進一步增大的時候,就不得不考慮表拆分的問題了:
垂直拆分:垂直拆分的意思就是把一個欄位較多的表,拆分成多個欄位較少的表;上文中也說過單表的欄位不宜過多,如果初期的表結構設計的就很好,就不會有垂直拆分的問題了;一般來說,MySQL單表的欄位最好不要超過二三十個。
水平拆分:就是我們常說的分庫分表了;分表,解決了單表數據過大的問題,但是畢竟還在同一台資料庫伺服器上,所以明頌裂IO、CPU、網路方面的壓力,並不會得到徹底的緩解,這個可以通過分庫來解決。水平拆分優點很明顯,可以利用多台資料庫伺服器的資源,提高了系統的負載能力;缺點是邏輯會變得復雜,跨節點的數據關聯性能差,維護難度大(特別是擴容的時候)。
希望我的回答,能夠幫助到你!我將持續分享Java開發、架構激閉設計、程序員職業發展等方面的見解。
❿ 優化資料庫大幅度提高Oracle的性能
幾個簡單的步驟大幅提高Oracle性能 我優化資料庫的三板斧
資料庫優化的討論可以說是一個永恆的主題 資深的Oracle優化人員通常會要求提出性能問題的人對資料庫做一個statspack 貼出資料庫配置等等 還有的人認為要抓出執行最慢的語句來進行優化 但實際情況是 提出疑問的人很可能根本不懂執行計劃 更不要說statspack了 而我認為 資料庫優化 應該首先從大的方面考慮 網路 伺服器硬體配置 操作系統配置 Oracle伺服器配置 數據結構組織 然後才是具體的調整 實際上網路 硬體等往往無法決定更換 應用程序一般也無法修改 因此應該著重從資料庫配置 數據結構上來下手 首先讓資料庫有一個良好的配置 然後再考慮具體優化某些過慢的語句 我在給我的用戶系統進行優化的過程中 總結了一些基本的 簡單易行的辦法來優化資料庫 算是我的三板斧 呵呵 不過請注意 這些不一定普遍使用 甚至有的會有副作用 但是對OLTP系統 基於成本的資料庫往往行之有效 不妨試試 (注 附件是Burleson寫的用來報告資料庫性能等信息的腳本 本文用到)
一.設置合適的SGA
常常有人抱怨伺服器硬體很好 但是Oracle就是很慢 很可能是內存分配不合理造成的 ( )假設內存有 M 這通常是小型應用 建議Oracle的SGA大約 M 其中 共享池(SHARED_POOL_SIZE)可以設置 M到 M 根據實際的用戶數 查詢等來定 數據塊緩沖區可以大致分配 M M i下需要設置DB_BLOCK_BUFFERS DB_BLOCK_BUFFER*DB_BLOCK_SIZE等於數據塊緩沖區大小 i 下的數據緩沖區可以用db_cache_size來直接分配
( )假設內存有 G Oracle 的SGA可以考慮分配 M 共享池分配 M到 M 數據緩沖區分配 M到 M
( )內存 G SGA可以考慮分配 G 共享池 M到 M 剩下的給數據塊緩沖區
( )內存 G以上 共享池 M到 M就足夠啦 再多也沒有太大幫助 (Biti_rainy有專述)數據緩沖區是盡可能的大 但是一定要注意兩個問題 一是要給操作系統和其他應用留夠內存 二是對於 位的操作系統 Oracle的SGA有 G的限制 有的 位操作系統上可以突破這個限制 方法還請看Biti的大作吧
二.分析表和索引 更改優化模式
Oracle默認優化模式是CHOOSE 在這種情況下 如果表沒有經過分析 經常導致查詢使用全表掃描 而不使用索引 這通常導致磁碟I/O太多 而導致查詢很慢 如果沒有使用執行計劃穩定性 則應該把表和索引都分析一下 這樣可能直接會使查詢速度大幅提升 分析表命令可以用ANALYZE TABLE 分析索引可以用ANALYZE INDEX命令 對於少於 萬的表 可以考慮分析整個表 對於很大的表 可以按百分比來分析 但是百分比不能過低 否則生成的統計信息可能不準確 可以通過DBA_TABLES的LAST_ANALYZED列來查看錶是否經過分析或分析時間 索引可以通過DBA_INDEXES的LAST_ANALYZED列
下面通過例子來說明分析前後的速度對比 (表CASE_GA_AJZLZ大約有 萬數據 有主鍵)首先在SQLPLUS中打開自動查詢執行計劃功能 (第一次要執行RDBMSADMINutlxplan sql來創建PLAN_TABLE這個表)
SQL> SET AUTOTRACE ON SQL>SET TIMING ON
通過SET AUTOTRACE ON 來查看語句的執行計劃 通過SET TIMING ON 來查看語句運行時間
SQL> select count(*) from CASE_GA_AJZLZ; COUNT(*) 已用時間: : : Execution Plan SELECT STATEMENT Optimizer=CHOOSE SORT (AGGREGATE) TABLE ACCESS (FULL) OF CASE_GA_AJZLZ ……………………
請注意上面分析中的TABLE ACCESS(FULL) 這說明該語句執行了全表掃描 而且查詢使用了 秒 這時表還沒有經過分析 下面我們來對該表進行分析
SQL> *** yze table CASE_GA_AJZLZ pute statistics;
表已分析 已用時間: : : 然後再來查詢
SQL> select count(*) from CASE_GA_AJZLZ; COUNT(*) 已用時間: : : Execution Plan SELECT STATEMENT Optimizer=FIRST_ROWS (Cost= Card= ) SORT (AGGREGATE) INDEX (FAST FULL SCAN) OF PK_AJZLZ (UNIQUE) (Cost= Card= ) …………………………
請注意 這次時間僅僅用了 秒!這要歸功於INDEX(FAST FULL SCAN) 通過分析表 查詢使用了PK_AJZLZ索引 磁碟I/O大幅減少 速度也大幅提升!下面的實用語句可以
用來生成分析某個用戶的所有表和索引 假設用戶是GAXZUSR
SQL> set pagesize SQL> spool d: *** yze_tables sql; SQL> select *** yze table ||owner|| ||table_name|| pute statistics; from dba_tables where owner= GAXZUSR ; SQL> spool off SQL> spool spool d: *** yze_indexes sql; SQL> select *** yze index ||owner|| ||index_name|| pute statistics; from dba_indexes where owner= GAXZUSR ; SQL> spool off SQL> @d: *** yze_tables sql SQL> @d: *** yze_indexes sql
解釋 上面的語句生成了兩個sql文件 分別分析全部的GAXZUSR的表和索引 如果需要按照百分比來分析表 可以修改一下腳本 通過上面的步驟 我們就完成了對表和索引的分析 可以測試一下速度的改進啦 建議定期運行上面的語句 尤其是數據經過大量更新
當然 也可以通過dbms_stats來分析表和索引 更方便一些 但是我仍然習慣上面的方法 因為成功與否會直接提示出來
另外 我們可以將優化模式進行修改 optimizer_mode值可以是RULE CHOOSE FIRST_ROWS和ALL_ROWS 對於OLTP系統 可以改成FIRST_ROWS 來要求查詢盡快返回結果 這樣即使不用分析 在一般情況下也可以提高查詢性能 但是表和索引經過分析後有助於找到最合適的執行計劃
三.設置cursor_sharing=FORCE 或SIMILAR
這種方法是 i才開始有的 oracle 不支持 通過設置該參數 可以強制共享只有文字不同的語句解釋計劃 例如下面兩條語句可以共享
SQL> SELECT * FROM MYTABLE WHERE NAME= tom SQL> SELECT * FROM MYTABLE WHERE NAME= turner
這個方法可以大幅降低緩沖區利用率低的問題 避免語句重新解釋 通過這個功能 可以很大程度上解決硬解析帶來的性能下降的問題 個人感覺可根據系統的實際情況 決定是否將該參數改成FORCE 該參數默認是exact 不過一定要注意 修改之前 必須先給ORACLE打補丁 否則改之後oracle會佔用 %的CPU 無法使用 對於ORACLE i 可以設置成SIMILAR 這個設置綜合了FORCE和EXACT的優點 不過請慎用這個功能 這個參數也可能帶來很大的負面影響!
四.將常用的小表 索引釘在數據緩存KEEP池中
內存上數據讀取速度遠遠比硬碟中讀取要快 據稱 內存中數據讀的速度是硬碟的 倍!如果資源比較豐富 把常用的小的 而且經常進行全表掃描的表給釘內存中 當然是在好不過了 可以簡單的通過ALTER TABLE tablename CACHE來實現 在ORACLE i之後可以使用ALTER TABLE table STORAGE(BUFFER_POOL KEEP) 一般來說 可以考慮把 數據塊之內的表放在keep池中 當然要根據內存大小等因素來定 關於如何查出那些表或索引符合條件 可以使用本文提供的access sql和access_report sql 這兩個腳本是著名的Oracle專家 Burleson寫的 你也可以在讀懂了情況下根據實際情況調整一下腳本 對於索引 可以通過ALTER INDEX indexname STORAGE(BUFFER_POOL KEEP)來釘在KEEP池中
將表定在KEEP池中需要做一些准備工作 對於ORACLE i 需要設置DB_KEEP_CACHE_SIZE 對於 i 需要設置buffer_pool_keep 在 i中 還要修改db_block_lru_latches 該參數默認是 無法使用buffer_pool_keep 該參數應該比 * *CPU數量少 但是要大於 才能設置DB_KEEP_CACHE_BUFFER buffer_pool_keep從db_block_buffers中分配 因此也要小於db_block_buffers 設置好這些參數後 就可以把常用對象永久釘在內存里
五.設置optimizer_max_permutations
對於多表連接查詢 如果採用基於成本優化(CBO) ORACLE會計算出很多種運行方案
從中選擇出最優方案 這個參數就是設置oracle究竟從多少種方案來選擇最優 如果設置太大 那麼計算最優方案過程也是時間比較長的 Oracle 和 i默認是 建議改成 對於 i 已經默認是 了
六.調整排序參數
( ) SORT_AREA_SIZE:默認的用來排序的SORT_AREA_SIZE大小是 K 通常顯得有點小 一般可以考慮設置成 M( ) 這個參數不能設置過大 因為每個連接都要分配同樣的排序內存
lishixin/Article/program/Oracle/201311/18879