1. 程式人生 > >數據庫優化思路與方向

數據庫優化思路與方向

每隔一秒 order 驗證 自動 上線 mysql group by hand 連接

一、基礎優化

mysql> show status like 'valus'

connections //鏈接參數

uptime //上線時間

slow_queries //慢查詢次數

com_select

com_insert

com_update

com_delete

二、優化查詢:

mysql> explain select * from handb.fruits;

+----+-------------+--------+------+---------------+------+---------+------+------+-------+

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

+----+-------------+--------+------+---------------+------+---------+------+------+-------+

| 1 | SIMPLE | fruits | ALL | NULL | NULL | NULL | NULL | 2 | |

+----+-------------+--------+------+---------------+------+---------+------+------+-------+

table查詢表的次數

possible_keys索引

key當前索引

key_len索引長度

ref一起查詢的列或者常數

rows必要行數

Extra詳細信息

三、索引對查詢的影響

四、優化數據庫結構

1、拆分舊表形成新表

2、增加中間表

五、插入優化

1、禁用索引

mysql> alter table book disable keys;

mysql> alter table book enable keys;

2、禁用唯一查詢

mysql> set unique_checks=0 | 1 ; //0關閉 1開啟

3、禁用外鍵檢查

mysql> set foreign_key_checks=0 | 1

4、禁用自動提交

mysql> set autocommit=0 | 1

六、分析檢查優化表

mysql> analyze table fruits;

type:status 常態

info信息 //有重復信息

note註意 //有null空值

warning警告 //超過過慢查詢時間

error錯誤 //表中有錯誤選項,不可用

七、檢查表

mysql> check table fruits fast;

QUICK:不掃描。不檢查錯誤的鏈接。

FAST:只檢查沒有被正確關閉的表。

CHANGED:只檢查上次檢查後被更改的表和沒有被正確關閉的表。

MEDIUM:掃描行,以驗證被刪除的鏈接是有效的,也可以計算各行的關鍵字效驗和,並使用計算出的效驗和驗證這一點。

EXTENDED:對每行的所有附件自進行一個全面的關鍵字查找,這可以確保表示百分百一致的,但是花費時間較長。

八、mysql服務器優化

緩沖區:希望被更改的數據在內存中駐留的時間更長而產生,主要是保留臟頁信息在內存中。不接受內存的管理,但是接受mysql程序的管理。

保證緩沖區大小:

[mysqld]

query_cache_size=512M

query_cache_type=1 //0表示不適用緩沖區。

1表示一旦開啟,所有的查詢都將使用緩沖區。如果不希望從緩沖區查詢,需要在select語句後增加選項no_sql_cache,表示當前查詢不適用緩沖區查詢。

2表示,只有在查詢的select是增加sql_cache才會從緩沖區查找。

key_buffer_size //索引緩沖區大小。索引緩沖區的所有線程共享。他的大小取決於內存的大小。太大會導致頻繁換頁,也會降低系統性能。

table_cache //同時打開的表的個數。越大表示同時打開的表越多。太大影響系統性能。

sort_buffer_size //排序緩存大小,越大,表示排序速度越快。提高order by和group by的效率默認2M

read_buffer_size //每個表分配的緩沖區的大小。當線程連續掃描時,才會使用這個緩沖區。

read_md_buffer_size //每個線程保留的緩沖區的大小,與上面相似,但是用於特定順序才會使用。如果出現連續掃描與讀取,則調整該參數。set session read_md_buffer_size = n

innodb_buffer_pool_size //innodb和索引的最大緩存,越大查詢越快

max_connections //表示數據庫的最大連接數。主要浪費內存大小。(大於系統最大鏈接數,會死機)

innodb_flush_log_at_trx_commit //表示緩沖區數據什麽時候寫入到日誌中,並且將日誌寫入到磁盤當中。該值有三個值:

0每隔一秒將數據寫入日誌,再寫入硬盤。不安全,但是速度快

1每次提交事務的時候才寫入日誌,再寫入硬盤。安全,但是速度慢

2每次提交事務的時候寫入日誌,每隔一秒寫入硬盤。出現故障會丟失1-2s數據。

back_log //表示多少個請求可以存放在堆棧中。對TCP/IP的監聽列隊的大小。不接受新請求之前把數據放在緩存。只有希望一個短時間內有很多鏈接,才啟用此值。操作系統的列隊限制比mysql更大,不能超過,否則無效。

interactive_timeout //關閉服務器鏈接前的等待時間。

thread_buffer_size //每個需要排序的線程分配的緩沖區的大小,如果有很多新的線程,可以調高這個值。

wait_timeout //服務器關閉一個鏈接所等待的時間s,默認28800


數據庫優化思路與方向