mysql 按日期拆分成多条记录_mysql性能优化2 设计规范 设计原则 结构优化 拆分 配置优化...
一、MYSQL數(shù)據(jù)庫設(shè)計(jì)規(guī)范
1、數(shù)據(jù)庫命名規(guī)范
a、采用26個(gè)英文字母(區(qū)分大小寫)和0-9的自然數(shù)(經(jīng)常不需要)加上下劃線’_'組成;
b、命名簡(jiǎn)潔明確(長(zhǎng)度不能超過30個(gè)字符);
c、例如:user, stat, log, 也可以wifi_user, wifi_stat, wifi_log給數(shù)據(jù)庫加個(gè)前綴;
d、除非是備份數(shù)據(jù)庫可以加0-9的自然數(shù):user_db_20151210;
2、數(shù)據(jù)庫表名命名規(guī)范
a、采用26個(gè)英文字母(區(qū)分大小寫)和0-9的自然數(shù)(經(jīng)常不需要)加上下劃線’‘組成;
b、命名簡(jiǎn)潔明確,多個(gè)單詞用下劃線’'分隔;
例如:user_login, user_profile, user_detail, user_role, user_role_relation,
user_role_right, user_role_right_relation
注:表前綴’user_'可以有效的把相同關(guān)系的表顯示在一起;
3、數(shù)據(jù)庫表字段名命名規(guī)范
a、采用26個(gè)英文字母(區(qū)分大小寫)和0-9的自然數(shù)(經(jīng)常不需要)加上下劃線’‘組成;
b、命名簡(jiǎn)潔明確,多個(gè)單詞用下劃線’'分隔;
例如:user_login表字段 user_id, user_name, pass_word, eamil, tickit, status, mobile, add_time;
c、每個(gè)表中必須有自增主鍵,add_time(默認(rèn)系統(tǒng)時(shí)間)
d、表與表之間的相關(guān)聯(lián)字段名稱要求盡可能的相同;
4、數(shù)據(jù)庫表字段類型規(guī)范
用盡量少的存儲(chǔ)空間來存數(shù)一個(gè)字段的數(shù)據(jù);
例如:能使用int就不要使用varchar、char,能用varchar(16)就不要使用varchar(256);
IP地址最好使用int類型;
固定長(zhǎng)度的類型最好使用char,例如:郵編;
能使用tinyint就不要使用smallint,int;
最好給每個(gè)字段一個(gè)默認(rèn)值,最好不能為null;
5、數(shù)據(jù)庫表索引規(guī)范
命名簡(jiǎn)潔明確,例如:user_login表user_name字段的索引應(yīng)為user_name_index唯一索引;
為每個(gè)表創(chuàng)建一個(gè)主鍵索引;
為每個(gè)表創(chuàng)建合理的索引;
建立復(fù)合索引請(qǐng)慎重;
6、簡(jiǎn)單熟悉數(shù)據(jù)庫范式
1、第一范式(1NF):字段值具有原子性,不能再分(所有關(guān)系型數(shù)據(jù)庫系統(tǒng)都滿足第一范式);
例如:姓名字段,其中姓和名是一個(gè)整體,如果區(qū)分姓和名那么必須設(shè)立兩個(gè)獨(dú)立字段;
2、第二范式(2NF):一個(gè)表必須有主鍵,即每行數(shù)據(jù)都能被唯一的區(qū)分;
備注:必須先滿足第一范式;
3、第三范式(3NF):一個(gè)表中不能包涵其他相關(guān)表中非關(guān)鍵字段的信息,即數(shù)據(jù)表不能有沉余字段;
備注:必須先滿足第二范式;
備注:往往我們?cè)谠O(shè)計(jì)表中不能遵守第三范式,因?yàn)楹侠淼某劣嘧侄螌?huì)給我們減少join的查詢;
例如:相冊(cè)表中會(huì)添加圖片的點(diǎn)擊數(shù)字段,在相冊(cè)圖片表中也會(huì)添加圖片的點(diǎn)擊數(shù)字段;
二、MYSQL數(shù)據(jù)庫設(shè)計(jì)原則
1、核心原則
不在數(shù)據(jù)庫做運(yùn)算;
cpu計(jì)算務(wù)必移至業(yè)務(wù)層;
控制列數(shù)量(字段少而精,字段數(shù)建議在20以內(nèi));
平衡范式與冗余(效率優(yōu)先;往往犧牲范式)
拒絕3B(拒絕大sql語句:big sql、拒絕大事務(wù):big transaction、拒絕大批量:big batch);
2、字段類原則
用好數(shù)值類型(用合適的字段類型節(jié)約空間);
字符轉(zhuǎn)化為數(shù)字(能轉(zhuǎn)化的最好轉(zhuǎn)化,同樣節(jié)約空間、提高查詢性能);
避免使用NULL字段(NULL字段很難查詢優(yōu)化、NULL字段的索引需要額外空間、NULL字段的復(fù)合索引無效);
少用text類型(盡量使用varchar代替text字段);
3、索引類原則
合理使用索引(改善查詢,減慢更新,索引一定不是越多越好);
字符字段必須建前綴索引;
不在索引做列運(yùn)算;
innodb主鍵推薦使用自增列(主鍵建立聚簇索引,主鍵不應(yīng)該被修改,字符串不應(yīng)該做主鍵)(理解Innodb的索引保存結(jié)構(gòu)就知道了);
不用外鍵(由程序保證約束);
4、sql類原則
sql語句盡可能簡(jiǎn)單(一條sql只能在一個(gè)cpu運(yùn)算,大語句拆小語句,減少鎖時(shí)間,一條大sql可以堵死整個(gè)庫);
簡(jiǎn)單的事務(wù);
避免使用trig/func(觸發(fā)器、函數(shù)不用客戶端程序取而代之);
不用select (消耗cpu,io,內(nèi)存,帶寬,這種程序不具有擴(kuò)展性);
OR改寫為IN(or的效率是n級(jí)別);
OR改寫為UNION(mysql的索引合并很弱智);
select id from t where phone = ’159′ or name = ‘john’;
=>
select id from t where phone=’159′
union
select id from t where name=’jonh’
避免負(fù)向%;
慎用count();
limit高效分頁(limit越大,效率越低);
使用union all替代union(union有去重開銷);
少用連接join;
使用group by;
請(qǐng)使用同類型比較;
打散批量更新;
三、數(shù)據(jù)庫結(jié)構(gòu)的優(yōu)化
1、選擇合適的數(shù)據(jù)類型
1、數(shù)據(jù)類型選擇
數(shù)據(jù)類型的選擇,重點(diǎn)在于“合適”二字,如何確定選擇的數(shù)據(jù)類型是否合適了?
1、使用可以存下你的數(shù)據(jù)的最小的數(shù)據(jù)類型。(時(shí)間類型數(shù)據(jù):可以使用varchar類型,可以使用int類型,也可以使用時(shí)間戳類型)
2、使用簡(jiǎn)單的數(shù)據(jù)類型,int要比varchar類型在mysql處理上簡(jiǎn)單。(int類型存儲(chǔ)時(shí)間是最好的選擇)
3、盡可能的使用not null定義字段。(innodb的特性所決定,非not null的值,需要額外的在字段存儲(chǔ),同時(shí)也會(huì)增加IO和存儲(chǔ)的開銷)
4、盡量少用text類型,非用不可時(shí)最好考慮分表。
2、案例
案例一:int類型存儲(chǔ)時(shí)間-時(shí)間轉(zhuǎn)換使用int來存儲(chǔ)日期時(shí)間,利用FROM_UNIXTIME(),UNIX_TIMESTAMP()兩個(gè)函數(shù)來進(jìn)行轉(zhuǎn)換。創(chuàng)建表:
create table test(id int auto_increment not null,timestr int ,primary key(id));導(dǎo)入數(shù)據(jù):
insert into test (timestr) values (unix_timestamp('2018-05-29 16:00:00'));查詢數(shù)據(jù):如下圖所示:
時(shí)間進(jìn)行轉(zhuǎn)換:
select FROM_UNIXTIME(timestr) from test;結(jié)論:
1、unix_timestamp()函數(shù)是將日期格式的數(shù)據(jù)轉(zhuǎn)換為int類型
2、FROM_UNIXTIME(timestr)函數(shù)是將int類型轉(zhuǎn)換為時(shí)間格式
案例二:ip地址的存儲(chǔ)
在我們的外部應(yīng)用中,都要記錄ip地址,大部分場(chǎng)合都是varchar(15)進(jìn)行存儲(chǔ),就需要15個(gè)字節(jié)進(jìn)行存儲(chǔ),但是bigint只需要8個(gè)字節(jié)進(jìn)行存儲(chǔ),當(dāng)數(shù)據(jù)量很大的時(shí)候(千萬級(jí)別的數(shù)據(jù)),相差7個(gè)字節(jié),但是不能小看這7個(gè)字節(jié),給大家算一下。
一個(gè)字段就多這么多,那如果我們這樣的字段需要上萬個(gè)字段了?是需要很多的存儲(chǔ)空間的。
使用bigint(8)來存儲(chǔ)ip地址,利用INET_ATON(),INET_NTOA()兩個(gè)函數(shù)來進(jìn)行轉(zhuǎn)換。
創(chuàng)建表:
create table sessions(id int auto_increment not null,ipaddress bigint,primary key (id));導(dǎo)入數(shù)據(jù):
insert into sessions (ipaddress)values (inet_aton('192.168.0.1'));轉(zhuǎn)換:
select inet_ntoa(ipaddress) from sessions;檢索:
2、數(shù)據(jù)庫表的范式化優(yōu)化
1、表范式化
范式化是指數(shù)據(jù)庫設(shè)計(jì)的規(guī)范,目前說道范式化一般是指第三設(shè)計(jì)范式。也就是要求數(shù)據(jù)表中不存在非關(guān)鍵字段對(duì)任意候選關(guān)鍵字段的傳遞函數(shù)依賴則符合第三范式。
存在以下傳遞函數(shù)依賴關(guān)系:
(商品名稱)->(分類)->(分類描述)
也就是說存在非關(guān)鍵字段 “分類描述”對(duì)關(guān)鍵字段“商品名稱”的傳遞函數(shù)依賴。
不符合第三范式要求的表存在以下問題:
1、數(shù)據(jù)冗余:(分類,分類描述)對(duì)于每一個(gè)商品都會(huì)進(jìn)行記錄。
2、數(shù)據(jù)的插入異常
3、數(shù)據(jù)的更新異常
4、數(shù)據(jù)的刪除異常(刪除所有數(shù)據(jù),分類和分類描述都會(huì)刪除,沒有所有的記錄)
如何轉(zhuǎn)換成符合第三范式的表(拆分表):
將原來的不符合第三范式的表拆分為3個(gè)表
商品表、分類表、分類和商品的關(guān)系表
2、反范式化
反范式化是指為了查詢效率的考慮把原本符合第三范式的表“適當(dāng)”的增加冗余,以達(dá)到優(yōu)化查詢效率的目的,反范式化是一種以空間來換取時(shí)間的操作。
如何查詢訂單信息?
select b.用戶名,b.電話,b.地址,a.訂單ID,sum(c.商品價(jià)格*c.商品數(shù)量)as 訂單價(jià)格from 訂單表 as ajoin 用戶表 as b on a.用戶ID=b.訂單IDjoin 訂單商品表 as c on c.訂單ID=b.訂單IDgroup by b.用戶名,b.電話,b.地址,a.訂單ID對(duì)于這樣的表結(jié)構(gòu),對(duì)于sum(),group by會(huì)產(chǎn)生臨時(shí)表,增加IO量。我們?cè)趺磧?yōu)化都效率不高,那我們?cè)趺礃硬拍茏屗矢吡?#xff0c;就需要一些字段進(jìn)行冗余。
訂單表中增加了冗余字段,那SQL該怎么寫了?
select a.用戶名,a.電話,a.地址,a.訂單ID,a.訂單價(jià)格 from 訂單表 as a說明:表結(jié)構(gòu)的設(shè)計(jì)直接涉及到SQL的查詢效率及優(yōu)化。
3、數(shù)據(jù)庫表的垂直拆分
1、垂直拆分定義
所謂的垂直拆分,就是把原來一個(gè)有很多列的表拆分成多個(gè)表,這解決了表的寬度問題。2、垂直拆分原則
通常垂直拆分可以按以下原則進(jìn)行:
1、把不常用的字段表單獨(dú)存放到一個(gè)表中。
2、把大字段獨(dú)立存放到一個(gè)表中。
3、把經(jīng)常一起使用的字段放到一起。
例子:以film表為例
在該表中,title和description這兩個(gè)字段占空間比較大,況且在使用頻率也比較低,因此可以將其提取出來,將上面的一個(gè)達(dá)標(biāo)垂直拆分為兩個(gè)表(film和film_ext):如下所示:
1、
2、
4、數(shù)據(jù)庫表的水平拆分
1、為什么水平拆分
表的水平拆分是為了解決單表數(shù)據(jù)量過大的問題,水平拆分的表每一個(gè)表的結(jié)構(gòu)都是完全一致的,以下面的peyment表為例來說明
desc payment;show create table payment;CREATE TABLE `payment` ( `payment_id` smallint(5) unsigned NOT NULL AUTO_INCREMENT, `customer_id` smallint(5) unsigned NOT NULL, `staff_id` tinyint(3) unsigned NOT NULL, `rental_id` int(11) DEFAULT NULL, `amount` decimal(5,2) NOT NULL, `payment_date` datetime NOT NULL, `last_update` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`payment_id`), KEY `idx_fk_staff_id` (`staff_id`), KEY `idx_fk_customer_id` (`customer_id`), KEY `fk_payment_rental` (`rental_id`), KEY `inx_paydate` (`payment_date`), CONSTRAINT `fk_payment_customer` FOREIGN KEY (`customer_id`) REFERENCES `customer` (`customer_id`) ON UPDATE CASCADE, CONSTRAINT `fk_payment_rental` FOREIGN KEY (`rental_id`) REFERENCES `rental` (`rental_id`) ON DELETE SET NULL ON UPDATE CASCADE, CONSTRAINT `fk_payment_staff` FOREIGN KEY (`staff_id`) REFERENCES `staff` (`staff_id`) ON UPDATE CASCADE) ENGINE=InnoDB AUTO_INCREMENT=16050 DEFAULT CHARSET=utf82、水平不拆分原因
如果單表的數(shù)據(jù)量達(dá)到上億條,那么這時(shí)候我們盡管加了完美的索引,查詢效率低,寫入的效率也相應(yīng)的降低。3、如何將數(shù)據(jù)平均分為N份
通常水平拆分的方法為:1、對(duì)customer_id進(jìn)行hash運(yùn)算,如果要拆分為5個(gè)表則使用mod(customer_id,5)取出0-4個(gè)值。
2、針對(duì)不動(dòng)的hashid把數(shù)據(jù)存儲(chǔ)到不同的表中。
4、水平拆分面臨的挑戰(zhàn)
1、夸分區(qū)表進(jìn)行數(shù)據(jù)查詢
前端業(yè)務(wù)統(tǒng)計(jì):
業(yè)務(wù)上給不同的用戶返回不同的業(yè)務(wù)信息,對(duì)分區(qū)表沒有大的挑戰(zhàn)。
2、統(tǒng)計(jì)及后臺(tái)報(bào)表操作
但是對(duì)后臺(tái)進(jìn)行報(bào)表統(tǒng)計(jì)時(shí),數(shù)據(jù)量比較大,后臺(tái)統(tǒng)計(jì)時(shí)效性比較低,后臺(tái)就用匯總表,將前后臺(tái)的表拆分開。
四、數(shù)據(jù)庫系統(tǒng)配置優(yōu)化
1、定義
數(shù)據(jù)庫是基于操作系統(tǒng)的,目前大多數(shù)MySQL都是安裝在linux系統(tǒng)之上,所以對(duì)于操作系統(tǒng)的一些參數(shù)配置也會(huì)影響到MySQL的性能,下面就列出一些常用的系統(tǒng)配置。
2、優(yōu)化配置參數(shù)-操作系統(tǒng)
優(yōu)化包括操作系統(tǒng)的優(yōu)化及MySQL的優(yōu)化
1、操作系統(tǒng)的優(yōu)化
網(wǎng)絡(luò)方面的配置,要修改/etc/sysctl.conf
1、增加tcp支持的隊(duì)列數(shù)
net.ipv4.tcp_max_syn_backlog = 65535//
2、減少斷開連接時(shí),資源回收(tcp有連接狀態(tài))
net.ipv4.tcp_max_tw_buckets = 8000 //net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_tw_recycle = 1net.ipv4.tcp_fin_timeout = 10說明: TCP是有連接狀態(tài),通過netstat查看連接狀態(tài),經(jīng)常會(huì)看到timeout狀態(tài)或者timewait狀態(tài)連接,為了加快timewait狀態(tài)的連接回收,就需要調(diào)整上面的四個(gè)參數(shù),保持TCP連接數(shù)在一個(gè)適當(dāng)?shù)臓顟B(tài)。
2、打開文件數(shù)的限制
打開文件數(shù)的限制,可以使用ulimit –a查看目錄的各個(gè)限制,可以修改/etc/security/limits.conf文件,增加以下內(nèi)容以修改打開文件數(shù)量的限制(永久生效)*Soft nofile 65535
*Hard nofile 65535
如果一次有效,就要使用ulimit –n 65535即可。(默認(rèn)情況是1024)
除此之外最好在MySQL服務(wù)器上關(guān)閉iptables,selinux等防火墻軟件。
3、優(yōu)化配置參數(shù)- MySQL配置文件優(yōu)化
1、MySQL配置文件修改
Mysql可以通過啟動(dòng)時(shí)指定參數(shù)和使用配置文件兩種方法進(jìn)行配置,在大多數(shù)情況下配置文件位于/etc/my.cnf 或者是 /etc/mysql/my.cnf在Windows系統(tǒng)配置文件可以是位于C://windows//my.ini文件,MySQL查找配置文件的順序可以通過以下方法獲得。
/usr/sbin/mysqld --verbose --help | grep -A 1 'default options'執(zhí)行后的結(jié)果如下圖所示:
注意:如果存在多個(gè)位置存在配置文件,則后面的會(huì)覆蓋前面的。
2、MySQL配置文件-常用參數(shù)說明
1、連接請(qǐng)求的變量
1、max_connections
MySQL的最大連接數(shù),增加該值增加mysqld 要求的文件描述符的數(shù)量。如果服務(wù)器的并發(fā)連接請(qǐng)求量比較大,建議調(diào)高此值,以增加并行連接數(shù)量,當(dāng)然這建立在機(jī)器能支撐的情況下,因?yàn)槿绻B接數(shù)越多,介于MySQL會(huì)為每個(gè)連接提供連接緩沖區(qū),就會(huì)開銷越多的內(nèi)存,所以要適當(dāng)調(diào)整該值,不能盲目提高設(shè)值。
數(shù)值過小會(huì)經(jīng)常出現(xiàn)ERROR 1040: Too many connections錯(cuò)誤,可以過’conn%’通配符查看當(dāng)前狀態(tài)的連接數(shù)量,以定奪該值的大小。
show variables like ‘max_connections’ 最大連接數(shù)
show status like ‘max_used_connections’響應(yīng)的連接數(shù)
如下:
show variables like 'max_connections';show variables like 'max_used_connections';說明:理想值設(shè)置為多大才合適了?
max_used_connections / max_connections * 100% (理想值≈ 85%)
如果max_used_connections跟max_connections相同 那么就是max_connections設(shè)置過低或者超過服務(wù)器負(fù)載上限了,低于10%則設(shè)置過大。
2、back_log
MySQL能暫存的連接數(shù)量。當(dāng)主要MySQL線程在一個(gè)很短時(shí)間內(nèi)得到非常多的連接請(qǐng)求,這就起作用。如果MySQL的連接數(shù)據(jù)達(dá)到max_connections時(shí),新來的請(qǐng)求將會(huì)被存在堆棧中,以等待某一連接釋放資源,該堆棧的數(shù)量即back_log,如果等待連接的數(shù)量超過back_log,將不被授予連接資源。
back_log值指出在MySQL暫時(shí)停止回答新請(qǐng)求之前的短時(shí)間內(nèi)有多少個(gè)請(qǐng)求可以被存在堆棧中。只有如果期望在一個(gè)短時(shí)間內(nèi)有很多連接,你需要增加它,換句話說,這值對(duì)到來的TCP/IP連接的偵聽隊(duì)列的大小。
當(dāng)觀察你主機(jī)進(jìn)程列表(mysql> show full processlist),發(fā)現(xiàn)大量264084 | unauthenticated user | xxx.xxx.xxx.xxx | NULL | Connect | NULL | login | NULL 的待連接進(jìn)程時(shí),就要加大back_log 的值了。
默認(rèn)數(shù)值是50,可調(diào)優(yōu)為128,對(duì)于Linux系統(tǒng)設(shè)置范圍為小于512的整數(shù)。
mysql> show full processlist;
±—±-----±----------±-------±--------±-----±------±----------------------+
| Id | User | Host | db | Command | Time | State | Info |
±—±-----±----------±-------±--------±-----±------±----------------------+
| 54 | root | localhost | sakila | Query | 0 | init | show full processlist |
±—±-----±----------±-------±--------±-----±------±----------------------+
1 row in set (0.00 sec)
3、interactive_timeout
一個(gè)交互連接在被服務(wù)器在關(guān)閉前等待行動(dòng)的秒數(shù)。一個(gè)交互的客戶被定義為對(duì)mysql_real_connect()使用CLIENT_INTERACTIVE 選項(xiàng)的客戶。
默認(rèn)數(shù)值是28800,可調(diào)優(yōu)為7200。
2、緩沖區(qū)變量
1、全局緩沖:
1、key_buffer_size
key_buffer_size指定索引緩沖區(qū)的大小,它決定索引處理的速度,尤其是索引讀的速度。通過檢查狀態(tài)值Key_read_requests和Key_reads,可以知道key_buffer_size設(shè)置是否合理。比例key_reads / key_read_requests應(yīng)該盡可能的低,至少是1:100,1:1000更好(上述狀態(tài)值可以使用SHOW STATUS LIKE ‘key_read%’獲得)。
key_buffer_size只對(duì)MyISAM表起作用。即使你不使用MyISAM表,但是內(nèi)部的臨時(shí)磁盤表是MyISAM表,也要使用該值。可以使用檢查狀態(tài)值created_tmp_disk_tables得知詳情。
舉例如下:
show variables like 'key_buffer_size';key_buffer_size為512MB,我們?cè)倏匆幌耴ey_buffer_size的使用情況:
show global status like 'key_read%';一共有27813678764個(gè)索引讀取請(qǐng)求,有6798830個(gè)請(qǐng)求在內(nèi)存中沒有找到直接從硬盤讀取索引,計(jì)算索引未命中緩存的概率:
key_cache_miss_rate =Key_reads / Key_read_requests * 100%,設(shè)置在1/1000左右較好
默認(rèn)配置數(shù)值是8388600(8M),主機(jī)有4GB內(nèi)存,可以調(diào)優(yōu)值268435456(256MB)。
2、query_cache_size
使用查詢緩沖,MySQL將查詢結(jié)果存放在緩沖區(qū)中,今后對(duì)于同樣的SELECT語句(區(qū)分大小寫),將直接從緩沖區(qū)中讀取結(jié)果。通過檢查狀態(tài)值Qcache_*,可以知道query_cache_size設(shè)置是否合理(上述狀態(tài)值可以使用SHOW STATUS LIKE ‘Qcache%’獲得)。如果Qcache_lowmem_prunes的值非常大,則表明經(jīng)常出現(xiàn)緩沖不夠的情況,如果Qcache_hits的值也非常大,則表明查詢緩沖使用非常頻繁,此時(shí)需要增加緩沖大小;如果Qcache_hits的值不大,則表明你的查詢重復(fù)率很低,這種情況下使用查詢緩沖反而會(huì)影響效率,那么可以考慮不用查詢緩沖。此外,在SELECT語句中加入SQL_NO_CACHE可以明確表示不使用查詢緩沖。
與查詢緩沖有關(guān)的參數(shù)還有query_cache_type、query_cache_limit、query_cache_min_res_unit。
query_cache_type指定是否使用查詢緩沖,可以設(shè)置為0、1、2,該變量是SESSION級(jí)的變量。
query_cache_limit指定單個(gè)查詢能夠使用的緩沖區(qū)大小,缺省為1M。
query_cache_min_res_unit是在4.1版本以后引入的,它指定分配緩沖區(qū)空間的最小單位,缺省為4K。檢查狀態(tài)值Qcache_free_blocks,如果該值非常大,則表明緩沖區(qū)中碎片很多,這就表明查詢結(jié)果都比較小,此時(shí)需要減小query_cache_min_res_unit。
舉例如下:
show global status like 'qcache%';查詢緩存碎片率= Qcache_free_blocks / Qcache_total_blocks * 100%
如果查詢緩存碎片率超過20%,可以用FLUSH QUERY CACHE整理緩存碎片,或者試試減小query_cache_min_res_unit,如果你的查詢都是小數(shù)據(jù)量的話。
查詢緩存利用率= (query_cache_size – Qcache_free_memory) / query_cache_size * 100%
查詢緩存利用率在25%以下的話說明query_cache_size設(shè)置的過大,可適當(dāng)減小;查詢緩存利用率在80%以上而且Qcache_lowmem_prunes > 50的話說明query_cache_size可能有點(diǎn)小,要不就是碎片太多。
查詢緩存命中率= (Qcache_hits – Qcache_inserts) / Qcache_hits * 100%
示例服務(wù)器查詢緩存碎片率=20.46%,查詢緩存利用率=62.26%,查詢緩存命中率=1.94%,命中率很差,可能寫操作比較頻繁吧,而且可能有些碎片。
3、record_buffer_size
每個(gè)進(jìn)行一個(gè)順序掃描的線程為其掃描的每張表分配這個(gè)大小的一個(gè)緩沖區(qū)。如果你做很多順序掃描,你可能想要增加該值。
默認(rèn)數(shù)值是131072(128K),可改為16773120 (16M)
4、read_rnd_buffer_size
隨機(jī)讀緩沖區(qū)大小。當(dāng)按任意順序讀取行時(shí)(例如,按照排序順序),將分配一個(gè)隨機(jī)讀緩存區(qū)。進(jìn)行排序查詢時(shí),MySQL會(huì)首先掃描一遍該緩沖,以避免磁盤搜索,提高查詢速度,如果需要排序大量數(shù)據(jù),可適當(dāng)調(diào)高該值。但MySQL會(huì)為每個(gè)客戶連接發(fā)放該緩沖空間,所以應(yīng)盡量適當(dāng)設(shè)置該值,以避免內(nèi)存開銷過大。一般可設(shè)置為16M
5、sort_buffer_size
每個(gè)需要進(jìn)行排序的線程分配該大小的一個(gè)緩沖區(qū)。增加這值加速ORDER BY或GROUP BY操作。
默認(rèn)數(shù)值是2097144(2M),可改為16777208 (16M)。
6、join_buffer_size
聯(lián)合查詢操作所能使用的緩沖區(qū)大小。
record_buffer_size,read_rnd_buffer_size,sort_buffer_size,join_buffer_size為每個(gè)線程獨(dú)占,也就是說,如果有100個(gè)線程連接,則占用為16M*100
7、table_cache
表高速緩存的大小。每當(dāng)MySQL訪問一個(gè)表時(shí),如果在表緩沖區(qū)中還有空間,該表就被打開并放入其中,這樣可以更快地訪問表內(nèi)容。通過檢查峰值時(shí)間的狀態(tài)值Open_tables和Opened_tables,可以決定是否需要增加table_cache的值。如果你發(fā)現(xiàn)open_tables等于table_cache,并且opened_tables在不斷增長(zhǎng),那么你就需要增加table_cache的值了(上述狀態(tài)值可以使用SHOW STATUS LIKE ‘Open%tables’獲得)。注意,不能盲目地把table_cache設(shè)置成很大的值。如果設(shè)置得太高,可能會(huì)造成文件描述符不足,從而造成性能不穩(wěn)定或者連接失敗。
1G內(nèi)存機(jī)器,推薦值是128-256。內(nèi)存在4GB左右的服務(wù)器該參數(shù)可設(shè)置為256M或384M。
8、max_heap_table_size
用戶可以創(chuàng)建的內(nèi)存表(memory table)的大小。這個(gè)值用來計(jì)算內(nèi)存表的最大行數(shù)值。這個(gè)變量支持動(dòng)態(tài)改變,即set @max_heap_table_size=#
這個(gè)變量和tmp_table_size一起限制了內(nèi)部?jī)?nèi)存表的大小。如果某個(gè)內(nèi)部heap(堆積)表大小超過tmp_table_size,MySQL可以根據(jù)需要自動(dòng)將內(nèi)存中的heap表改為基于硬盤的MyISAM表。
9、tmp_table_size
通過設(shè)置tmp_table_size選項(xiàng)來增加一張臨時(shí)表的大小,例如做高級(jí)GROUP BY操作生成的臨時(shí)表。如果調(diào)高該值,MySQL同時(shí)將增加heap表的大小,可達(dá)到提高聯(lián)接查詢速度的效果,建議盡量?jī)?yōu)化查詢,要確保查詢過程中生成的臨時(shí)表在內(nèi)存中,避免臨時(shí)表過大導(dǎo)致生成基于硬盤的MyISAM表。
show global status like 'created_tmp%';每次創(chuàng)建臨時(shí)表,Created_tmp_tables增加,如果臨時(shí)表大小超過tmp_table_size,則是在磁盤上創(chuàng)建臨時(shí)表,Created_tmp_disk_tables也增加,Created_tmp_files表示MySQL服務(wù)創(chuàng)建的臨時(shí)文件文件數(shù),比較理想的配置是:
Created_tmp_disk_tables / Created_tmp_tables * 100% <= 25%比如上面的服務(wù)器Created_tmp_disk_tables / Created_tmp_tables * 100% =1.20%,應(yīng)該相當(dāng)好了
默認(rèn)為16M,可調(diào)到64-256最佳,線程獨(dú)占,太大可能內(nèi)存不夠I/O堵塞
10、thread_cache_size
可以復(fù)用的保存在中的線程的數(shù)量。如果有,新的線程從緩存中取得,當(dāng)斷開連接的時(shí)候如果有空間,客戶的線置在緩存中。如果有很多新的線程,為了提高性能可以這個(gè)變量值。
通過比較 Connections和Threads_created狀態(tài)的變量,可以看到這個(gè)變量的作用。默認(rèn)值為110,可調(diào)優(yōu)為80。
11、thread_concurrency
推薦設(shè)置為服務(wù)器 CPU核數(shù)的2倍,例如雙核的CPU, 那么thread_concurrency的應(yīng)該為4;2個(gè)雙核的cpu, thread_concurrency的值應(yīng)為8。默認(rèn)為8
12、wait_timeout
指定一個(gè)請(qǐng)求的最大連接時(shí)間,對(duì)于4GB左右內(nèi)存的服務(wù)器可以設(shè)置為5-10。
3、配置InnoDB的幾個(gè)變量
1、innodb_buffer_pool_size
對(duì)于InnoDB表來說,innodb_buffer_pool_size的作用就相當(dāng)于key_buffer_size對(duì)于MyISAM表的作用一樣。InnoDB使用該參數(shù)指定大小的內(nèi)存來緩沖數(shù)據(jù)和索引。對(duì)于單獨(dú)的MySQL數(shù)據(jù)庫服務(wù)器,最大可以把該值設(shè)置成物理內(nèi)存的80%。
根據(jù)MySQL手冊(cè),對(duì)于2G內(nèi)存的機(jī)器,推薦值是1G(50%)。
show status like ‘innodb%’;
2、innodb_flush_log_at_trx_commit
主要控制了innodb將log buffer中的數(shù)據(jù)寫入日志文件并flush磁盤的時(shí)間點(diǎn),取值分別為0、1、2三個(gè)。0,表示當(dāng)事務(wù)提交時(shí),不做日志寫入操作,而是每秒鐘將log buffer中的數(shù)據(jù)寫入日志文件并flush磁盤一次;1,則在每秒鐘或是每次事物的提交都會(huì)引起日志文件寫入、flush磁盤的操作,確保了事務(wù)的ACID;設(shè)置為2,每次事務(wù)提交引起寫入日志文件的動(dòng)作,但每秒鐘完成一次flush磁盤操作。
實(shí)際測(cè)試發(fā)現(xiàn),該值對(duì)插入數(shù)據(jù)的速度影響非常大,設(shè)置為2時(shí)插入10000條記錄只需要2秒,設(shè)置為0時(shí)只需要1秒,而設(shè)置為1時(shí)則需要229秒。因此,MySQL手冊(cè)也建議盡量將插入操作合并成一個(gè)事務(wù),這樣可以大幅提高速度。
根據(jù)MySQL手冊(cè),在允許丟失最近部分事務(wù)的危險(xiǎn)的前提下,可以把該值設(shè)為0或2。
3、innodb_log_buffer_size
log緩存大小,一般為1-8M,默認(rèn)為1M,對(duì)于較大的事務(wù),可以增大緩存大小。可設(shè)置為4M或8M。
4、innodb_additional_mem_pool_size
該參數(shù)指定InnoDB用來存儲(chǔ)數(shù)據(jù)字典和其他內(nèi)部數(shù)據(jù)結(jié)構(gòu)的內(nèi)存池大小。缺省值是1M。通常不用太大,只要夠用就行,應(yīng)該與表結(jié)構(gòu)的復(fù)雜度有關(guān)系。如果不夠用,MySQL會(huì)在錯(cuò)誤日志中寫入一條警告信息。
根據(jù)MySQL手冊(cè),對(duì)于2G內(nèi)存的機(jī)器,推薦值是20M,可適當(dāng)增加。
innodb_thread_concurrency=8
推薦設(shè)置為 2*(NumCPUs+NumDisks),默認(rèn)一般為8
[client]port = 3306socket = /tmp/mysql.sock[mysqld]port = 3306socket = /tmp/mysql.sockbasedir = /usr/local/mysqldatadir = /data/mysqlpid-file = /data/mysql/mysql.piduser = mysqlbind-address = 0.0.0.0server-id = 1 #表示是本機(jī)的序號(hào)為1,一般來講就是master的意思5、skip-name-resolve
# 禁止MySQL對(duì)外部連接進(jìn)行DNS解析,使用這一選項(xiàng)可以消除MySQL進(jìn)行DNS解析的時(shí)間。但需要注意,如果開啟該選項(xiàng),# 則所有遠(yuǎn)程主機(jī)連接授權(quán)都要使用IP地址方式,否則MySQL將無法正常處理連接請(qǐng)求#skip-networkingback_log = 600# MySQL能有的連接數(shù)量。當(dāng)主要MySQL線程在一個(gè)很短時(shí)間內(nèi)得到非常多的連接請(qǐng)求,這就起作用,# 然后主線程花些時(shí)間(盡管很短)檢查連接并且啟動(dòng)一個(gè)新線程。back_log值指出在MySQL暫時(shí)停止回答新請(qǐng)求之前的短時(shí)間內(nèi)多少個(gè)請(qǐng)求可以被存在堆棧中。# 如果期望在一個(gè)短時(shí)間內(nèi)有很多連接,你需要增加它。也就是說,如果MySQL的連接數(shù)據(jù)達(dá)到max_connections時(shí),新來的請(qǐng)求將會(huì)被存在堆棧中,# 以等待某一連接釋放資源,該堆棧的數(shù)量即back_log,如果等待連接的數(shù)量超過back_log,將不被授予連接資源。# 另外,這值(back_log)限于您的操作系統(tǒng)對(duì)到來的TCP/IP連接的偵聽隊(duì)列的大小。# 你的操作系統(tǒng)在這個(gè)隊(duì)列大小上有它自己的限制(可以檢查你的OS文檔找出這個(gè)變量的最大值),試圖設(shè)定back_log高于你的操作系統(tǒng)的限制將是無效的。max_connections = 1000# MySQL的最大連接數(shù),如果服務(wù)器的并發(fā)連接請(qǐng)求量比較大,建議調(diào)高此值,以增加并行連接數(shù)量,當(dāng)然這建立在機(jī)器能支撐的情況下,因?yàn)槿绻B接數(shù)越多,介于MySQL會(huì)為每個(gè)連接提供連接緩沖區(qū),就會(huì)開銷越多的內(nèi)存,所以要適當(dāng)調(diào)整該值,不能盲目提高設(shè)值。可以過’conn%’通配符查看當(dāng)前狀態(tài)的連接數(shù)量,以定奪該值的大小。max_connect_errors = 6000# 對(duì)于同一主機(jī),如果有超出該參數(shù)值個(gè)數(shù)的中斷錯(cuò)誤連接,則該主機(jī)將被禁止連接。如需對(duì)該主機(jī)進(jìn)行解禁,執(zhí)行:FLUSH HOST。open_files_limit = 65535# MySQL打開的文件描述符限制,默認(rèn)最小1024;當(dāng)open_files_limit沒有被配置的時(shí)候,比較max_connections*5和ulimit -n的值,哪個(gè)大用哪個(gè),# 當(dāng)open_file_limit被配置的時(shí)候,比較open_files_limit和max_connections*5的值,哪個(gè)大用哪個(gè)。table_open_cache = 128# MySQL每打開一個(gè)表,都會(huì)讀入一些數(shù)據(jù)到table_open_cache緩存中,當(dāng)MySQL在這個(gè)緩存中找不到相應(yīng)信息時(shí),才會(huì)去磁盤上讀取。默認(rèn)值64# 假定系統(tǒng)有200個(gè)并發(fā)連接,則需將此參數(shù)設(shè)置為200*N(N為每個(gè)連接所需的文件描述符數(shù)目);# 當(dāng)把table_open_cache設(shè)置為很大時(shí),如果系統(tǒng)處理不了那么多文件描述符,那么就會(huì)出現(xiàn)客戶端失效,連接不上max_allowed_packet = 4M# 接受的數(shù)據(jù)包大小;增加該變量的值十分安全,這是因?yàn)閮H當(dāng)需要時(shí)才會(huì)分配額外內(nèi)存。例如,僅當(dāng)你發(fā)出長(zhǎng)查詢或MySQLd必須返回大的結(jié)果行時(shí)MySQLd才會(huì)分配更多內(nèi)存。# 該變量之所以取較小默認(rèn)值是一種預(yù)防措施,以捕獲客戶端和服務(wù)器之間的錯(cuò)誤信息包,并確保不會(huì)因偶然使用大的信息包而導(dǎo)致內(nèi)存溢出。binlog_cache_size = 1M# 一個(gè)事務(wù),在沒有提交的時(shí)候,產(chǎn)生的日志,記錄到Cache中;等到事務(wù)提交需要提交的時(shí)候,則把日志持久化到磁盤。默認(rèn)binlog_cache_size大小32Kmax_heap_table_size = 8M# 定義了用戶可以創(chuàng)建的內(nèi)存表(memory table)的大小。這個(gè)值用來計(jì)算內(nèi)存表的最大行數(shù)值。這個(gè)變量支持動(dòng)態(tài)改變tmp_table_size = 16M# MySQL的heap(堆積)表緩沖大小。所有聯(lián)合在一個(gè)DML指令內(nèi)完成,并且大多數(shù)聯(lián)合甚至可以不用臨時(shí)表即可以完成。# 大多數(shù)臨時(shí)表是基于內(nèi)存的(HEAP)表。具有大的記錄長(zhǎng)度的臨時(shí)表 (所有列的長(zhǎng)度的和)或包含BLOB列的表存儲(chǔ)在硬盤上。# 如果某個(gè)內(nèi)部heap(堆積)表大小超過tmp_table_size,MySQL可以根據(jù)需要自動(dòng)將內(nèi)存中的heap表改為基于硬盤的MyISAM表。還可以通過設(shè)置tmp_table_size選項(xiàng)來增加臨時(shí)表的大小。也就是說,如果調(diào)高該值,MySQL同時(shí)將增加heap表的大小,可達(dá)到提高聯(lián)接查詢速度的效果read_buffer_size = 2M# MySQL讀入緩沖區(qū)大小。對(duì)表進(jìn)行順序掃描的請(qǐng)求將分配一個(gè)讀入緩沖區(qū),MySQL會(huì)為它分配一段內(nèi)存緩沖區(qū)。read_buffer_size變量控制這一緩沖區(qū)的大小。# 如果對(duì)表的順序掃描請(qǐng)求非常頻繁,并且你認(rèn)為頻繁掃描進(jìn)行得太慢,可以通過增加該變量值以及內(nèi)存緩沖區(qū)大小提高其性能read_rnd_buffer_size = 8M# MySQL的隨機(jī)讀緩沖區(qū)大小。當(dāng)按任意順序讀取行時(shí)(例如,按照排序順序),將分配一個(gè)隨機(jī)讀緩存區(qū)。進(jìn)行排序查詢時(shí),# MySQL會(huì)首先掃描一遍該緩沖,以避免磁盤搜索,提高查詢速度,如果需要排序大量數(shù)據(jù),可適當(dāng)調(diào)高該值。但MySQL會(huì)為每個(gè)客戶連接發(fā)放該緩沖空間,所以應(yīng)盡量適當(dāng)設(shè)置該值,以避免內(nèi)存開銷過大sort_buffer_size = 8M# MySQL執(zhí)行排序使用的緩沖大小。如果想要增加ORDER BY的速度,首先看是否可以讓MySQL使用索引而不是額外的排序階段。# 如果不能,可以嘗試增加sort_buffer_size變量的大小join_buffer_size = 8M# 聯(lián)合查詢操作所能使用的緩沖區(qū)大小,和sort_buffer_size一樣,該參數(shù)對(duì)應(yīng)的分配內(nèi)存也是每連接獨(dú)享thread_cache_size = 8# 這個(gè)值(默認(rèn)8)表示可以重新利用保存在緩存中線程的數(shù)量,當(dāng)斷開連接時(shí)如果緩存中還有空間,那么客戶端的線程將被放到緩存中,# 如果線程重新被請(qǐng)求,那么請(qǐng)求將從緩存中讀取,如果緩存中是空的或者是新的請(qǐng)求,那么這個(gè)線程將被重新創(chuàng)建,如果有很多新的線程,# 增加這個(gè)值可以改善系統(tǒng)性能.通過比較Connections和Threads_created狀態(tài)的變量,可以看到這個(gè)變量的作用。(–>表示要調(diào)整的值)# 根據(jù)物理內(nèi)存設(shè)置規(guī)則如下:# 1G —> 8# 2G —> 16# 3G —> 32# 大于3G —> 64query_cache_size = 8M#MySQL的查詢緩沖大小(從4.0.1開始,MySQL提供了查詢緩沖機(jī)制)使用查詢緩沖,MySQL將SELECT語句和查詢結(jié)果存放在緩沖區(qū)中,# 今后對(duì)于同樣的SELECT語句(區(qū)分大小寫),將直接從緩沖區(qū)中讀取結(jié)果。根據(jù)MySQL用戶手冊(cè),使用查詢緩沖最多可以達(dá)到238%的效率。# 通過檢查狀態(tài)值’Qcache_%’,可以知道query_cache_size設(shè)置是否合理:如果Qcache_lowmem_prunes的值非常大,則表明經(jīng)常出現(xiàn)緩沖不夠的情況,# 如果Qcache_hits的值也非常大,則表明查詢緩沖使用非常頻繁,此時(shí)需要增加緩沖大小;如果Qcache_hits的值不大,則表明你的查詢重復(fù)率很低,# 這種情況下使用查詢緩沖反而會(huì)影響效率,那么可以考慮不用查詢緩沖。此外,在SELECT語句中加入SQL_NO_CACHE可以明確表示不使用查詢緩沖query_cache_limit = 2M#指定單個(gè)查詢能夠使用的緩沖區(qū)大小,默認(rèn)1Mkey_buffer_size = 4M#指定用于索引的緩沖區(qū)大小,增加它可得到更好處理的索引(對(duì)所有讀和多重寫),到你能負(fù)擔(dān)得起那樣多。如果你使它太大,# 系統(tǒng)將開始換頁并且真的變慢了。對(duì)于內(nèi)存在4GB左右的服務(wù)器該參數(shù)可設(shè)置為384M或512M。通過檢查狀態(tài)值Key_read_requests和Key_reads,# 可以知道key_buffer_size設(shè)置是否合理。比例key_reads/key_read_requests應(yīng)該盡可能的低,# 至少是1:100,1:1000更好(上述狀態(tài)值可以使用SHOW STATUS LIKE ‘key_read%’獲得)。注意:該參數(shù)值設(shè)置的過大反而會(huì)是服務(wù)器整體效率降低ft_min_word_len = 4# 分詞詞匯最小長(zhǎng)度,默認(rèn)4transaction_isolation = REPEATABLE-READ# MySQL支持4種事務(wù)隔離級(jí)別,他們分別是:# READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE.# 如沒有指定,MySQL默認(rèn)采用的是REPEATABLE-READ,ORACLE默認(rèn)的是READ-COMMITTEDlog_bin = mysql-binbinlog_format = mixedexpire_logs_days = 30 #超過30天的binlog刪除log_error = /data/mysql/mysql-error.log #錯(cuò)誤日志路徑slow_query_log = 1long_query_time = 1 #慢查詢時(shí)間 超過1秒則為慢查詢slow_query_log_file = /data/mysql/mysql-slow.logperformance_schema = 0explicit_defaults_for_timestamp#lower_case_table_names = 1 #不區(qū)分大小寫skip-external-locking #MySQL選項(xiàng)以避免外部鎖定。該選項(xiàng)默認(rèn)開啟default-storage-engine = InnoDB #默認(rèn)存儲(chǔ)引擎innodb_file_per_table = 1# InnoDB為獨(dú)立表空間模式,每個(gè)數(shù)據(jù)庫的每個(gè)表都會(huì)生成一個(gè)數(shù)據(jù)空間# 獨(dú)立表空間優(yōu)點(diǎn):# 1.每個(gè)表都有自已獨(dú)立的表空間。# 2.每個(gè)表的數(shù)據(jù)和索引都會(huì)存在自已的表空間中。# 3.可以實(shí)現(xiàn)單表在不同的數(shù)據(jù)庫中移動(dòng)。# 4.空間可以回收(除drop table操作處,表空不能自已回收)# 缺點(diǎn):# 單表增加過大,如超過100G# 結(jié)論:# 共享表空間在Insert操作上少有優(yōu)勢(shì)。其它都沒獨(dú)立表空間表現(xiàn)好。當(dāng)啟用獨(dú)立表空間時(shí),請(qǐng)合理調(diào)整:innodb_open_filesinnodb_open_files = 500# 限制Innodb能打開的表的數(shù)據(jù),如果庫里的表特別多的情況,請(qǐng)?jiān)黾舆@個(gè)。這個(gè)值默認(rèn)是300innodb_buffer_pool_size = 64M# InnoDB使用一個(gè)緩沖池來保存索引和原始數(shù)據(jù), 不像MyISAM.# 這里你設(shè)置越大,你在存取表里面數(shù)據(jù)時(shí)所需要的磁盤I/O越少.# 在一個(gè)獨(dú)立使用的數(shù)據(jù)庫服務(wù)器上,你可以設(shè)置這個(gè)變量到服務(wù)器物理內(nèi)存大小的80%# 不要設(shè)置過大,否則,由于物理內(nèi)存的競(jìng)爭(zhēng)可能導(dǎo)致操作系統(tǒng)的換頁顛簸.# 注意在32位系統(tǒng)上你每個(gè)進(jìn)程可能被限制在 2-3.5G 用戶層面內(nèi)存限制,# 所以不要設(shè)置的太高.innodb_write_io_threads = 4innodb_read_io_threads = 4# innodb使用后臺(tái)線程處理數(shù)據(jù)頁上的讀寫 I/O(輸入輸出)請(qǐng)求,根據(jù)你的 CPU 核數(shù)來更改,默認(rèn)是4# 注:這兩個(gè)參數(shù)不支持動(dòng)態(tài)改變,需要把該參數(shù)加入到my.cnf里,修改完后重啟MySQL服務(wù),允許值的范圍從 1-64innodb_thread_concurrency = 0# 默認(rèn)設(shè)置為 0,表示不限制并發(fā)數(shù),這里推薦設(shè)置為0,更好去發(fā)揮CPU多核處理能力,提高并發(fā)量innodb_purge_threads = 1# InnoDB中的清除操作是一類定期回收無用數(shù)據(jù)的操作。在之前的幾個(gè)版本中,清除操作是主線程的一部分,這意味著運(yùn)行時(shí)它可能會(huì)堵塞其它的數(shù)據(jù)庫操作。# 從MySQL5.5.X版本開始,該操作運(yùn)行于獨(dú)立的線程中,并支持更多的并發(fā)數(shù)。用戶可通過設(shè)置innodb_purge_threads配置參數(shù)來選擇清除操作是否使用單# 獨(dú)線程,默認(rèn)情況下參數(shù)設(shè)置為0(不使用單獨(dú)線程),設(shè)置為 1 時(shí)表示使用單獨(dú)的清除線程。建議為1innodb_flush_log_at_trx_commit = 2# 0:如果innodb_flush_log_at_trx_commit的值為0,log buffer每秒就會(huì)被刷寫日志文件到磁盤,提交事務(wù)的時(shí)候不做任何操作(執(zhí)行是由mysql的master thread線程來執(zhí)行的。# 主線程中每秒會(huì)將重做日志緩沖寫入磁盤的重做日志文件(REDO LOG)中。不論事務(wù)是否已經(jīng)提交)默認(rèn)的日志文件是ib_logfile0,ib_logfile1# 1:當(dāng)設(shè)為默認(rèn)值1的時(shí)候,每次提交事務(wù)的時(shí)候,都會(huì)將log buffer刷寫到日志。# 2:如果設(shè)為2,每次提交事務(wù)都會(huì)寫日志,但并不會(huì)執(zhí)行刷的操作。每秒定時(shí)會(huì)刷到日志文件。要注意的是,并不能保證100%每秒一定都會(huì)刷到磁盤,這要取決于進(jìn)程的調(diào)度。# 每次事務(wù)提交的時(shí)候?qū)?shù)據(jù)寫入事務(wù)日志,而這里的寫入僅是調(diào)用了文件系統(tǒng)的寫入操作,而文件系統(tǒng)是有 緩存的,所以這個(gè)寫入并不能保證數(shù)據(jù)已經(jīng)寫入到物理磁盤# 默認(rèn)值1是為了保證完整的ACID。當(dāng)然,你可以將這個(gè)配置項(xiàng)設(shè)為1以外的值來換取更高的性能,但是在系統(tǒng)崩潰的時(shí)候,你將會(huì)丟失1秒的數(shù)據(jù)。# 設(shè)為0的話,mysqld進(jìn)程崩潰的時(shí)候,就會(huì)丟失最后1秒的事務(wù)。設(shè)為2,只有在操作系統(tǒng)崩潰或者斷電的時(shí)候才會(huì)丟失最后1秒的數(shù)據(jù)。InnoDB在做恢復(fù)的時(shí)候會(huì)忽略這個(gè)值。# 總結(jié)# 設(shè)為1當(dāng)然是最安全的,但性能頁是最差的(相對(duì)其他兩個(gè)參數(shù)而言,但不是不能接受)。如果對(duì)數(shù)據(jù)一致性和完整性要求不高,完全可以設(shè)為2,如果只最求性能,例如高并發(fā)寫的日志服務(wù)器,設(shè)為0來獲得更高性能innodb_log_buffer_size = 2M# 此參數(shù)確定些日志文件所用的內(nèi)存大小,以M為單位。緩沖區(qū)更大能提高性能,但意外的故障將會(huì)丟失數(shù)據(jù)。MySQL開發(fā)人員建議設(shè)置為1-8M之間innodb_log_file_size = 32M# 此參數(shù)確定數(shù)據(jù)日志文件的大小,更大的設(shè)置可以提高性能,但也會(huì)增加恢復(fù)故障數(shù)據(jù)庫所需的時(shí)間innodb_log_files_in_group = 3# 為提高性能,MySQL可以以循環(huán)方式將日志文件寫到多個(gè)文件。推薦設(shè)置為3innodb_max_dirty_pages_pct = 90# innodb主線程刷新緩存池中的數(shù)據(jù),使臟數(shù)據(jù)比例小于90%innodb_lock_wait_timeout = 120# InnoDB事務(wù)在被回滾之前可以等待一個(gè)鎖定的超時(shí)秒數(shù)。InnoDB在它自己的鎖定表中自動(dòng)檢測(cè)事務(wù)死鎖并且回滾事務(wù)。InnoDB用LOCK TABLES語句注意到鎖定設(shè)置。默認(rèn)值是50秒bulk_insert_buffer_size = 8M# 批量插入緩存大小, 這個(gè)參數(shù)是針對(duì)MyISAM存儲(chǔ)引擎來說的。適用于在一次性插入100-1000+條記錄時(shí), 提高效率。默認(rèn)值是8M。可以針對(duì)數(shù)據(jù)量的大小,翻倍增加。myisam_sort_buffer_size = 8M# MyISAM設(shè)置恢復(fù)表之時(shí)使用的緩沖區(qū)的尺寸,當(dāng)在REPAIR TABLE或用CREATE INDEX創(chuàng)建索引或ALTER TABLE過程中排序 MyISAM索引分配的緩沖區(qū)myisam_max_sort_file_size = 10G# 如果臨時(shí)文件會(huì)變得超過索引,不要使用快速排序索引方法來創(chuàng)建一個(gè)索引。注釋:這個(gè)參數(shù)以字節(jié)的形式給出myisam_repair_threads = 1# 如果該值大于1,在Repair by sorting過程中并行創(chuàng)建MyISAM表索引(每個(gè)索引在自己的線程內(nèi))interactive_timeout = 28800# 服務(wù)器關(guān)閉交互式連接前等待活動(dòng)的秒數(shù)。交互式客戶端定義為在mysql_real_connect()中使用CLIENT_INTERACTIVE選項(xiàng)的客戶端。默認(rèn)值:28800秒(8小時(shí))wait_timeout = 28800# 服務(wù)器關(guān)閉非交互連接之前等待活動(dòng)的秒數(shù)。在線程啟動(dòng)時(shí),根據(jù)全局wait_timeout值或全局interactive_timeout值初始化會(huì)話wait_timeout值,# 取決于客戶端類型(由mysql_real_connect()的連接選項(xiàng)CLIENT_INTERACTIVE定義)。參數(shù)默認(rèn)值:28800秒(8小時(shí))# MySQL服務(wù)器所支持的最大連接數(shù)是有上限的,因?yàn)槊總€(gè)連接的建立都會(huì)消耗內(nèi)存,因此我們希望客戶端在連接到MySQL Server處理完相應(yīng)的操作后,# 應(yīng)該斷開連接并釋放占用的內(nèi)存。如果你的MySQL Server有大量的閑置連接,他們不僅會(huì)白白消耗內(nèi)存,而且如果連接一直在累加而不斷開,# 最終肯定會(huì)達(dá)到MySQL Server的連接上限數(shù),這會(huì)報(bào)’too many connections’的錯(cuò)誤。對(duì)于wait_timeout的值設(shè)定,應(yīng)該根據(jù)系統(tǒng)的運(yùn)行情況來判斷。# 在系統(tǒng)運(yùn)行一段時(shí)間后,可以通過show processlist命令查看當(dāng)前系統(tǒng)的連接狀態(tài),如果發(fā)現(xiàn)有大量的sleep狀態(tài)的連接進(jìn)程,則說明該參數(shù)設(shè)置的過大,# 可以進(jìn)行適當(dāng)?shù)恼{(diào)整小些。要同時(shí)設(shè)置interactive_timeout和wait_timeout才會(huì)生效。[mysqldump]quickmax_allowed_packet = 16M #服務(wù)器發(fā)送和接受的最大包長(zhǎng)度[myisamchk]key_buffer_size = 8Msort_buffer_size = 8Mread_buffer = 4Mwrite_buffer = 4M附錄:
1、查看innodb的相關(guān)參數(shù)信息
show variables like 'innodb%';2、查看innodb的相關(guān)參數(shù)狀態(tài)
show status like 'innodb%';五、MySQL的執(zhí)行順序
MySQL的語句一共分為11步,如下圖所標(biāo)注的那樣,最先執(zhí)行的總是FROM操作,最后執(zhí)行的是LIMIT操作。其中每一個(gè)操作都會(huì)產(chǎn)生一張?zhí)摂M的表,這個(gè)虛擬的表作為一個(gè)處理的輸入,只是這些虛擬的表對(duì)用戶來說是透明的,但是只有最后一個(gè)虛擬的表才會(huì)被作為結(jié)果返回。如果沒有在語句中指定某一個(gè)子句,那么將會(huì)跳過相應(yīng)的步驟。
下面我們來具體分析一下查詢處理的每一個(gè)階段
1.FORM: 對(duì)FROM的左邊的表和右邊的表計(jì)算笛卡爾積。產(chǎn)生虛表VT1
2.ON: 對(duì)虛表VT1進(jìn)行ON篩選,只有那些符合的行才會(huì)被記錄在虛表VT2中。
3.JOIN: 如果指定了OUTER JOIN(比如left join、 right join),那么保留表中未匹配的行就會(huì)作為外部行添加到虛擬表VT2中,產(chǎn)生虛擬表VT3, rug from子句中包含兩個(gè)以上的表的話,那么就會(huì)對(duì)上一個(gè)join連接產(chǎn)生的結(jié)果VT3和下一個(gè)表重復(fù)執(zhí)行步驟1~3這三個(gè)步驟,一直到處理完所有的表為止。
4.WHERE: 對(duì)虛擬表VT3進(jìn)行WHERE條件過濾。只有符合的記錄才會(huì)被插入到虛擬表VT4中。
5.GROUP BY: 根據(jù)group by子句中的列,對(duì)VT4中的記錄進(jìn)行分組操作,產(chǎn)生VT5.
6.CUBE | ROLLUP: 對(duì)表VT5進(jìn)行cube或者rollup操作,產(chǎn)生表VT6.
7.HAVING: 對(duì)虛擬表VT6應(yīng)用having過濾,只有符合的記錄才會(huì)被 插入到虛擬表VT7中。
六、MySQL執(zhí)行引擎介紹(了解)
1、MyISAM存儲(chǔ)引擎
不支持事務(wù)、也不支持外鍵,優(yōu)勢(shì)是訪問速度快,對(duì)事務(wù)完整性沒有 要求或者以select,insert為主的應(yīng)用基本上可以用這個(gè)引擎來創(chuàng)建表
支持3種不同的存儲(chǔ)格式,分別是:靜態(tài)表;動(dòng)態(tài)表;壓縮表
靜態(tài)表:
表中的字段都是非變長(zhǎng)字段,這樣每個(gè)記錄都是固定長(zhǎng)度的,優(yōu)點(diǎn)存儲(chǔ)非常迅速,容易緩存,出現(xiàn)故障容易恢復(fù);缺點(diǎn)是占用的空間通常比動(dòng)態(tài)表多(因?yàn)榇鎯?chǔ)時(shí)會(huì)按照列的寬度定義補(bǔ)足空格)ps:在取數(shù)據(jù)的時(shí)候,默認(rèn)會(huì)把字段后面的空格去掉,如果不注意會(huì)把數(shù)據(jù)本身帶的空格也會(huì)忽略。
動(dòng)態(tài)表:
記錄不是固定長(zhǎng)度的,這樣存儲(chǔ)的優(yōu)點(diǎn)是占用的空間相對(duì)較少;缺點(diǎn):頻繁的更新、刪除數(shù)據(jù)容易產(chǎn)生碎片,需要定期執(zhí)行OPTIMIZE TABLE或者myisamchk-r命令來改善性能
壓縮表:
因?yàn)槊總€(gè)記錄是被單獨(dú)壓縮的,所以只有非常小的訪問開支
2、InnoDB存儲(chǔ)引擎
該存儲(chǔ)引擎提供了具有提交、回滾和崩潰恢復(fù)能力的事務(wù)安全。但是對(duì)比MyISAM引擎,寫的處理效率會(huì)差一些,并且會(huì)占用更多的磁盤空間以保留數(shù)據(jù)和索引。
InnoDB存儲(chǔ)引擎的特點(diǎn):支持自動(dòng)增長(zhǎng)列,支持外鍵約束
3、MEMORY存儲(chǔ)引擎
Memory存儲(chǔ)引擎使用存在于內(nèi)存中的內(nèi)容來創(chuàng)建表。每個(gè)memory表只實(shí)際對(duì)應(yīng)一個(gè)磁盤文件,格式是.frm。memory類型的表訪問非常的快,因?yàn)樗臄?shù)據(jù)是放在內(nèi)存中的,并且默認(rèn)使用HASH索引,但是一旦服務(wù)關(guān)閉,表中的數(shù)據(jù)就會(huì)丟失掉。
MEMORY存儲(chǔ)引擎的表可以選擇使用BTREE索引或者HASH索引,兩種不同類型的索引有其不同的使用范圍
Hash索引優(yōu)點(diǎn):
Hash 索引結(jié)構(gòu)的特殊性,其檢索效率非常高,索引的檢索可以一次定位,不像B-Tree 索引需要從根節(jié)點(diǎn)到枝節(jié)點(diǎn),最后才能訪問到頁節(jié)點(diǎn)這樣多次的IO訪問,所以 Hash 索引的查詢效率要遠(yuǎn)高于 B-Tree 索引。
Hash索引缺點(diǎn):
那么不精確查找呢,也很明顯,因?yàn)閔ash算法是基于等值計(jì)算的,所以對(duì)于“l(fā)ike”等范圍查找hash索引無效,不支持;
Memory類型的存儲(chǔ)引擎主要用于哪些內(nèi)容變化不頻繁的代碼表,或者作為統(tǒng)計(jì)操作的中間結(jié)果表,便于高效地對(duì)中間結(jié)果進(jìn)行分析并得到最終的統(tǒng)計(jì)結(jié)果,。對(duì)存儲(chǔ)引擎為memory的表進(jìn)行更新操作要謹(jǐn)慎,因?yàn)閿?shù)據(jù)并沒有實(shí)際寫入到磁盤中,所以一定要對(duì)下次重新啟動(dòng)服務(wù)后如何獲得這些修改后的數(shù)據(jù)有所考慮。
4、MERGE存儲(chǔ)引擎
Merge存儲(chǔ)引擎是一組MyISAM表的組合,這些MyISAM表必須結(jié)構(gòu)完全相同,merge表本身并沒有數(shù)據(jù),對(duì)merge類型的表可以進(jìn)行查詢,更新,刪除操作,這些操作實(shí)際上是對(duì)內(nèi)部的MyISAM表進(jìn)行的。
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的mysql 按日期拆分成多条记录_mysql性能优化2 设计规范 设计原则 结构优化 拆分 配置优化...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 高中发表在论文计算机方面,高中计算机教学
- 下一篇: web中hasmoreelements_