日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql 按日期拆分成多条记录_mysql性能优化2 设计规范 设计原则 结构优化 拆分 配置优化...

發布時間:2024/8/23 数据库 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql 按日期拆分成多条记录_mysql性能优化2 设计规范 设计原则 结构优化 拆分 配置优化... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、MYSQL數據庫設計規范

1、數據庫命名規范

a、采用26個英文字母(區分大小寫)和0-9的自然數(經常不需要)加上下劃線’_'組成;

b、命名簡潔明確(長度不能超過30個字符);

c、例如:user, stat, log, 也可以wifi_user, wifi_stat, wifi_log給數據庫加個前綴;

d、除非是備份數據庫可以加0-9的自然數:user_db_20151210;

2、數據庫表名命名規范

a、采用26個英文字母(區分大小寫)和0-9的自然數(經常不需要)加上下劃線’‘組成;

b、命名簡潔明確,多個單詞用下劃線’'分隔;

例如:user_login, user_profile, user_detail, user_role, user_role_relation,

user_role_right, user_role_right_relation

注:表前綴’user_'可以有效的把相同關系的表顯示在一起;

3、數據庫表字段名命名規范

a、采用26個英文字母(區分大小寫)和0-9的自然數(經常不需要)加上下劃線’‘組成;

b、命名簡潔明確,多個單詞用下劃線’'分隔;

例如:user_login表字段 user_id, user_name, pass_word, eamil, tickit, status, mobile, add_time;

c、每個表中必須有自增主鍵,add_time(默認系統時間)

d、表與表之間的相關聯字段名稱要求盡可能的相同;

4、數據庫表字段類型規范

用盡量少的存儲空間來存數一個字段的數據;

例如:能使用int就不要使用varchar、char,能用varchar(16)就不要使用varchar(256);

IP地址最好使用int類型;

固定長度的類型最好使用char,例如:郵編;

能使用tinyint就不要使用smallint,int;

最好給每個字段一個默認值,最好不能為null;

5、數據庫表索引規范

命名簡潔明確,例如:user_login表user_name字段的索引應為user_name_index唯一索引;

為每個表創建一個主鍵索引;

為每個表創建合理的索引;

建立復合索引請慎重;

6、簡單熟悉數據庫范式

1、第一范式(1NF):字段值具有原子性,不能再分(所有關系型數據庫系統都滿足第一范式);

例如:姓名字段,其中姓和名是一個整體,如果區分姓和名那么必須設立兩個獨立字段;

2、第二范式(2NF):一個表必須有主鍵,即每行數據都能被唯一的區分;

備注:必須先滿足第一范式;

3、第三范式(3NF):一個表中不能包涵其他相關表中非關鍵字段的信息,即數據表不能有沉余字段;

備注:必須先滿足第二范式;

備注:往往我們在設計表中不能遵守第三范式,因為合理的沉余字段將會給我們減少join的查詢;

例如:相冊表中會添加圖片的點擊數字段,在相冊圖片表中也會添加圖片的點擊數字段;

二、MYSQL數據庫設計原則

1、核心原則

不在數據庫做運算;

cpu計算務必移至業務層;

控制列數量(字段少而精,字段數建議在20以內);

平衡范式與冗余(效率優先;往往犧牲范式)

拒絕3B(拒絕大sql語句:big sql、拒絕大事務:big transaction、拒絕大批量:big batch);

2、字段類原則

用好數值類型(用合適的字段類型節約空間);

字符轉化為數字(能轉化的最好轉化,同樣節約空間、提高查詢性能);

避免使用NULL字段(NULL字段很難查詢優化、NULL字段的索引需要額外空間、NULL字段的復合索引無效);

少用text類型(盡量使用varchar代替text字段);

3、索引類原則

合理使用索引(改善查詢,減慢更新,索引一定不是越多越好);

字符字段必須建前綴索引;

不在索引做列運算;

innodb主鍵推薦使用自增列(主鍵建立聚簇索引,主鍵不應該被修改,字符串不應該做主鍵)(理解Innodb的索引保存結構就知道了);

不用外鍵(由程序保證約束);

4、sql類原則

sql語句盡可能簡單(一條sql只能在一個cpu運算,大語句拆小語句,減少鎖時間,一條大sql可以堵死整個庫);

簡單的事務;

避免使用trig/func(觸發器、函數不用客戶端程序取而代之);

不用select (消耗cpu,io,內存,帶寬,這種程序不具有擴展性);

OR改寫為IN(or的效率是n級別);

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’

避免負向%;

慎用count();

limit高效分頁(limit越大,效率越低);

使用union all替代union(union有去重開銷);

少用連接join;

使用group by;

請使用同類型比較;

打散批量更新;

三、數據庫結構的優化

1、選擇合適的數據類型

1、數據類型選擇

數據類型的選擇,重點在于“合適”二字,如何確定選擇的數據類型是否合適了?

1、使用可以存下你的數據的最小的數據類型。(時間類型數據:可以使用varchar類型,可以使用int類型,也可以使用時間戳類型)

2、使用簡單的數據類型,int要比varchar類型在mysql處理上簡單。(int類型存儲時間是最好的選擇)

3、盡可能的使用not null定義字段。(innodb的特性所決定,非not null的值,需要額外的在字段存儲,同時也會增加IO和存儲的開銷)

4、盡量少用text類型,非用不可時最好考慮分表。

2、案例

案例一:int類型存儲時間-時間轉換使用int來存儲日期時間,利用FROM_UNIXTIME(),UNIX_TIMESTAMP()兩個函數來進行轉換。

創建表:

create table test(id int auto_increment not null,timestr int ,primary key(id));

導入數據:

insert into test (timestr) values (unix_timestamp('2018-05-29 16:00:00'));

查詢數據:如下圖所示:

時間進行轉換:

select FROM_UNIXTIME(timestr) from test;

結論:

1、unix_timestamp()函數是將日期格式的數據轉換為int類型

2、FROM_UNIXTIME(timestr)函數是將int類型轉換為時間格式

案例二:ip地址的存儲

在我們的外部應用中,都要記錄ip地址,大部分場合都是varchar(15)進行存儲,就需要15個字節進行存儲,但是bigint只需要8個字節進行存儲,當數據量很大的時候(千萬級別的數據),相差7個字節,但是不能小看這7個字節,給大家算一下。

一個字段就多這么多,那如果我們這樣的字段需要上萬個字段了?是需要很多的存儲空間的。

使用bigint(8)來存儲ip地址,利用INET_ATON(),INET_NTOA()兩個函數來進行轉換。

創建表:

create table sessions(id int auto_increment not null,ipaddress bigint,primary key (id));

導入數據:

insert into sessions (ipaddress)values (inet_aton('192.168.0.1'));

轉換:

select inet_ntoa(ipaddress) from sessions;

檢索:

2、數據庫表的范式化優化

1、表范式化

范式化是指數據庫設計的規范,目前說道范式化一般是指第三設計范式。也就是要求數據表中不存在非關鍵字段對任意候選關鍵字段的傳遞函數依賴則符合第三范式。

存在以下傳遞函數依賴關系:

(商品名稱)->(分類)->(分類描述)

也就是說存在非關鍵字段 “分類描述”對關鍵字段“商品名稱”的傳遞函數依賴。

不符合第三范式要求的表存在以下問題:

1、數據冗余:(分類,分類描述)對于每一個商品都會進行記錄。

2、數據的插入異常

3、數據的更新異常

4、數據的刪除異常(刪除所有數據,分類和分類描述都會刪除,沒有所有的記錄)

如何轉換成符合第三范式的表(拆分表):

將原來的不符合第三范式的表拆分為3個表

商品表、分類表、分類和商品的關系表

2、反范式化

反范式化是指為了查詢效率的考慮把原本符合第三范式的表“適當”的增加冗余,以達到優化查詢效率的目的,反范式化是一種以空間來換取時間的操作。

如何查詢訂單信息?

select b.用戶名,b.電話,b.地址,a.訂單ID,sum(c.商品價格*c.商品數量)as 訂單價格from 訂單表 as ajoin 用戶表 as b on a.用戶ID=b.訂單IDjoin 訂單商品表 as c on c.訂單ID=b.訂單IDgroup by b.用戶名,b.電話,b.地址,a.訂單ID

對于這樣的表結構,對于sum(),group by會產生臨時表,增加IO量。我們怎么優化都效率不高,那我們怎么樣才能讓它效率高了,就需要一些字段進行冗余。

訂單表中增加了冗余字段,那SQL該怎么寫了?

select a.用戶名,a.電話,a.地址,a.訂單ID,a.訂單價格 from 訂單表 as a

說明:表結構的設計直接涉及到SQL的查詢效率及優化。

3、數據庫表的垂直拆分

1、垂直拆分定義

所謂的垂直拆分,就是把原來一個有很多列的表拆分成多個表,這解決了表的寬度問題。

2、垂直拆分原則

通常垂直拆分可以按以下原則進行:

1、把不常用的字段表單獨存放到一個表中。

2、把大字段獨立存放到一個表中。

3、把經常一起使用的字段放到一起。

例子:以film表為例

在該表中,title和description這兩個字段占空間比較大,況且在使用頻率也比較低,因此可以將其提取出來,將上面的一個達標垂直拆分為兩個表(film和film_ext):如下所示:

1、

2、

4、數據庫表的水平拆分

1、為什么水平拆分

表的水平拆分是為了解決單表數據量過大的問題,水平拆分的表每一個表的結構都是完全一致的,以下面的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=utf8

2、水平不拆分原因

如果單表的數據量達到上億條,那么這時候我們盡管加了完美的索引,查詢效率低,寫入的效率也相應的降低。

3、如何將數據平均分為N份

通常水平拆分的方法為:

1、對customer_id進行hash運算,如果要拆分為5個表則使用mod(customer_id,5)取出0-4個值。

2、針對不動的hashid把數據存儲到不同的表中。

4、水平拆分面臨的挑戰

1、夸分區表進行數據查詢

前端業務統計:

業務上給不同的用戶返回不同的業務信息,對分區表沒有大的挑戰。

2、統計及后臺報表操作

但是對后臺進行報表統計時,數據量比較大,后臺統計時效性比較低,后臺就用匯總表,將前后臺的表拆分開。

四、數據庫系統配置優化

1、定義

數據庫是基于操作系統的,目前大多數MySQL都是安裝在linux系統之上,所以對于操作系統的一些參數配置也會影響到MySQL的性能,下面就列出一些常用的系統配置。

2、優化配置參數-操作系統

優化包括操作系統的優化及MySQL的優化

1、操作系統的優化

網絡方面的配置,要修改/etc/sysctl.conf

1、增加tcp支持的隊列數

net.ipv4.tcp_max_syn_backlog = 65535//

2、減少斷開連接時,資源回收(tcp有連接狀態)

net.ipv4.tcp_max_tw_buckets = 8000 //net.ipv4.tcp_tw_reuse = 1net.ipv4.tcp_tw_recycle = 1net.ipv4.tcp_fin_timeout = 10

說明: TCP是有連接狀態,通過netstat查看連接狀態,經常會看到timeout狀態或者timewait狀態連接,為了加快timewait狀態的連接回收,就需要調整上面的四個參數,保持TCP連接數在一個適當的狀態。

2、打開文件數的限制

打開文件數的限制,可以使用ulimit –a查看目錄的各個限制,可以修改/etc/security/limits.conf文件,增加以下內容以修改打開文件數量的限制(永久生效)

*Soft nofile 65535

*Hard nofile 65535

如果一次有效,就要使用ulimit –n 65535即可。(默認情況是1024)

除此之外最好在MySQL服務器上關閉iptables,selinux等防火墻軟件。

3、優化配置參數- MySQL配置文件優化

1、MySQL配置文件修改

Mysql可以通過啟動時指定參數和使用配置文件兩種方法進行配置,在大多數情況下配置文件位于/etc/my.cnf 或者是 /etc/mysql/my.cnf在Windows系統配置文件可以是位于C://windows//my.ini文件,MySQL查找配置文件的順序可以通過以下方法獲得。

/usr/sbin/mysqld --verbose --help | grep -A 1 'default options'

執行后的結果如下圖所示:

注意:如果存在多個位置存在配置文件,則后面的會覆蓋前面的。

2、MySQL配置文件-常用參數說明

1、連接請求的變量

1、max_connections

MySQL的最大連接數,增加該值增加mysqld 要求的文件描述符的數量。如果服務器的并發連接請求量比較大,建議調高此值,以增加并行連接數量,當然這建立在機器能支撐的情況下,因為如果連接數越多,介于MySQL會為每個連接提供連接緩沖區,就會開銷越多的內存,所以要適當調整該值,不能盲目提高設值。

數值過小會經常出現ERROR 1040: Too many connections錯誤,可以過’conn%’通配符查看當前狀態的連接數量,以定奪該值的大小。

show variables like ‘max_connections’ 最大連接數

show status like ‘max_used_connections’響應的連接數

如下:

show variables like 'max_connections';show variables like 'max_used_connections';

說明:理想值設置為多大才合適了?

max_used_connections / max_connections * 100% (理想值≈ 85%)

如果max_used_connections跟max_connections相同 那么就是max_connections設置過低或者超過服務器負載上限了,低于10%則設置過大。

2、back_log

MySQL能暫存的連接數量。當主要MySQL線程在一個很短時間內得到非常多的連接請求,這就起作用。如果MySQL的連接數據達到max_connections時,新來的請求將會被存在堆棧中,以等待某一連接釋放資源,該堆棧的數量即back_log,如果等待連接的數量超過back_log,將不被授予連接資源。

back_log值指出在MySQL暫時停止回答新請求之前的短時間內有多少個請求可以被存在堆棧中。只有如果期望在一個短時間內有很多連接,你需要增加它,換句話說,這值對到來的TCP/IP連接的偵聽隊列的大小。

當觀察你主機進程列表(mysql> show full processlist),發現大量264084 | unauthenticated user | xxx.xxx.xxx.xxx | NULL | Connect | NULL | login | NULL 的待連接進程時,就要加大back_log 的值了。

默認數值是50,可調優為128,對于Linux系統設置范圍為小于512的整數。

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

一個交互連接在被服務器在關閉前等待行動的秒數。一個交互的客戶被定義為對mysql_real_connect()使用CLIENT_INTERACTIVE 選項的客戶。

默認數值是28800,可調優為7200。

2、緩沖區變量

1、全局緩沖:

1、key_buffer_size

key_buffer_size指定索引緩沖區的大小,它決定索引處理的速度,尤其是索引讀的速度。通過檢查狀態值Key_read_requests和Key_reads,可以知道key_buffer_size設置是否合理。比例key_reads / key_read_requests應該盡可能的低,至少是1:100,1:1000更好(上述狀態值可以使用SHOW STATUS LIKE ‘key_read%’獲得)。

key_buffer_size只對MyISAM表起作用。即使你不使用MyISAM表,但是內部的臨時磁盤表是MyISAM表,也要使用該值。可以使用檢查狀態值created_tmp_disk_tables得知詳情。

舉例如下:

show variables like 'key_buffer_size';

key_buffer_size為512MB,我們再看一下key_buffer_size的使用情況:

show global status like 'key_read%';

一共有27813678764個索引讀取請求,有6798830個請求在內存中沒有找到直接從硬盤讀取索引,計算索引未命中緩存的概率:

key_cache_miss_rate =Key_reads / Key_read_requests * 100%,設置在1/1000左右較好

默認配置數值是8388600(8M),主機有4GB內存,可以調優值268435456(256MB)。

2、query_cache_size

使用查詢緩沖,MySQL將查詢結果存放在緩沖區中,今后對于同樣的SELECT語句(區分大小寫),將直接從緩沖區中讀取結果。通過檢查狀態值Qcache_*,可以知道query_cache_size設置是否合理(上述狀態值可以使用SHOW STATUS LIKE ‘Qcache%’獲得)。如果Qcache_lowmem_prunes的值非常大,則表明經常出現緩沖不夠的情況,如果Qcache_hits的值也非常大,則表明查詢緩沖使用非常頻繁,此時需要增加緩沖大小;如果Qcache_hits的值不大,則表明你的查詢重復率很低,這種情況下使用查詢緩沖反而會影響效率,那么可以考慮不用查詢緩沖。此外,在SELECT語句中加入SQL_NO_CACHE可以明確表示不使用查詢緩沖。

與查詢緩沖有關的參數還有query_cache_type、query_cache_limit、query_cache_min_res_unit。

query_cache_type指定是否使用查詢緩沖,可以設置為0、1、2,該變量是SESSION級的變量。

query_cache_limit指定單個查詢能夠使用的緩沖區大小,缺省為1M。

query_cache_min_res_unit是在4.1版本以后引入的,它指定分配緩沖區空間的最小單位,缺省為4K。檢查狀態值Qcache_free_blocks,如果該值非常大,則表明緩沖區中碎片很多,這就表明查詢結果都比較小,此時需要減小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,如果你的查詢都是小數據量的話。

查詢緩存利用率= (query_cache_size – Qcache_free_memory) / query_cache_size * 100%

查詢緩存利用率在25%以下的話說明query_cache_size設置的過大,可適當減小;查詢緩存利用率在80%以上而且Qcache_lowmem_prunes > 50的話說明query_cache_size可能有點小,要不就是碎片太多。

查詢緩存命中率= (Qcache_hits – Qcache_inserts) / Qcache_hits * 100%

示例服務器查詢緩存碎片率=20.46%,查詢緩存利用率=62.26%,查詢緩存命中率=1.94%,命中率很差,可能寫操作比較頻繁吧,而且可能有些碎片。

3、record_buffer_size

每個進行一個順序掃描的線程為其掃描的每張表分配這個大小的一個緩沖區。如果你做很多順序掃描,你可能想要增加該值。

默認數值是131072(128K),可改為16773120 (16M)

4、read_rnd_buffer_size

隨機讀緩沖區大小。當按任意順序讀取行時(例如,按照排序順序),將分配一個隨機讀緩存區。進行排序查詢時,MySQL會首先掃描一遍該緩沖,以避免磁盤搜索,提高查詢速度,如果需要排序大量數據,可適當調高該值。但MySQL會為每個客戶連接發放該緩沖空間,所以應盡量適當設置該值,以避免內存開銷過大。一般可設置為16M

5、sort_buffer_size

每個需要進行排序的線程分配該大小的一個緩沖區。增加這值加速ORDER BY或GROUP BY操作。

默認數值是2097144(2M),可改為16777208 (16M)。

6、join_buffer_size

聯合查詢操作所能使用的緩沖區大小。

record_buffer_size,read_rnd_buffer_size,sort_buffer_size,join_buffer_size為每個線程獨占,也就是說,如果有100個線程連接,則占用為16M*100

7、table_cache

表高速緩存的大小。每當MySQL訪問一個表時,如果在表緩沖區中還有空間,該表就被打開并放入其中,這樣可以更快地訪問表內容。通過檢查峰值時間的狀態值Open_tables和Opened_tables,可以決定是否需要增加table_cache的值。如果你發現open_tables等于table_cache,并且opened_tables在不斷增長,那么你就需要增加table_cache的值了(上述狀態值可以使用SHOW STATUS LIKE ‘Open%tables’獲得)。注意,不能盲目地把table_cache設置成很大的值。如果設置得太高,可能會造成文件描述符不足,從而造成性能不穩定或者連接失敗。

1G內存機器,推薦值是128-256。內存在4GB左右的服務器該參數可設置為256M或384M。

8、max_heap_table_size

用戶可以創建的內存表(memory table)的大小。這個值用來計算內存表的最大行數值。這個變量支持動態改變,即set @max_heap_table_size=#

這個變量和tmp_table_size一起限制了內部內存表的大小。如果某個內部heap(堆積)表大小超過tmp_table_size,MySQL可以根據需要自動將內存中的heap表改為基于硬盤的MyISAM表。

9、tmp_table_size

通過設置tmp_table_size選項來增加一張臨時表的大小,例如做高級GROUP BY操作生成的臨時表。如果調高該值,MySQL同時將增加heap表的大小,可達到提高聯接查詢速度的效果,建議盡量優化查詢,要確保查詢過程中生成的臨時表在內存中,避免臨時表過大導致生成基于硬盤的MyISAM表。

show global status like 'created_tmp%';

每次創建臨時表,Created_tmp_tables增加,如果臨時表大小超過tmp_table_size,則是在磁盤上創建臨時表,Created_tmp_disk_tables也增加,Created_tmp_files表示MySQL服務創建的臨時文件文件數,比較理想的配置是:

Created_tmp_disk_tables / Created_tmp_tables * 100% <= 25%比如上面的服務器Created_tmp_disk_tables / Created_tmp_tables * 100% =1.20%,應該相當好了

默認為16M,可調到64-256最佳,線程獨占,太大可能內存不夠I/O堵塞

10、thread_cache_size

可以復用的保存在中的線程的數量。如果有,新的線程從緩存中取得,當斷開連接的時候如果有空間,客戶的線置在緩存中。如果有很多新的線程,為了提高性能可以這個變量值。

通過比較 Connections和Threads_created狀態的變量,可以看到這個變量的作用。默認值為110,可調優為80。

11、thread_concurrency

推薦設置為服務器 CPU核數的2倍,例如雙核的CPU, 那么thread_concurrency的應該為4;2個雙核的cpu, thread_concurrency的值應為8。默認為8

12、wait_timeout

指定一個請求的最大連接時間,對于4GB左右內存的服務器可以設置為5-10。

3、配置InnoDB的幾個變量

1、innodb_buffer_pool_size

對于InnoDB表來說,innodb_buffer_pool_size的作用就相當于key_buffer_size對于MyISAM表的作用一樣。InnoDB使用該參數指定大小的內存來緩沖數據和索引。對于單獨的MySQL數據庫服務器,最大可以把該值設置成物理內存的80%。

根據MySQL手冊,對于2G內存的機器,推薦值是1G(50%)。

show status like ‘innodb%’;

2、innodb_flush_log_at_trx_commit

主要控制了innodb將log buffer中的數據寫入日志文件并flush磁盤的時間點,取值分別為0、1、2三個。0,表示當事務提交時,不做日志寫入操作,而是每秒鐘將log buffer中的數據寫入日志文件并flush磁盤一次;1,則在每秒鐘或是每次事物的提交都會引起日志文件寫入、flush磁盤的操作,確保了事務的ACID;設置為2,每次事務提交引起寫入日志文件的動作,但每秒鐘完成一次flush磁盤操作。

實際測試發現,該值對插入數據的速度影響非常大,設置為2時插入10000條記錄只需要2秒,設置為0時只需要1秒,而設置為1時則需要229秒。因此,MySQL手冊也建議盡量將插入操作合并成一個事務,這樣可以大幅提高速度。

根據MySQL手冊,在允許丟失最近部分事務的危險的前提下,可以把該值設為0或2。

3、innodb_log_buffer_size

log緩存大小,一般為1-8M,默認為1M,對于較大的事務,可以增大緩存大小。可設置為4M或8M。

4、innodb_additional_mem_pool_size

該參數指定InnoDB用來存儲數據字典和其他內部數據結構的內存池大小。缺省值是1M。通常不用太大,只要夠用就行,應該與表結構的復雜度有關系。如果不夠用,MySQL會在錯誤日志中寫入一條警告信息。

根據MySQL手冊,對于2G內存的機器,推薦值是20M,可適當增加。

innodb_thread_concurrency=8

推薦設置為 2*(NumCPUs+NumDisks),默認一般為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 #表示是本機的序號為1,一般來講就是master的意思

5、skip-name-resolve

# 禁止MySQL對外部連接進行DNS解析,使用這一選項可以消除MySQL進行DNS解析的時間。但需要注意,如果開啟該選項,# 則所有遠程主機連接授權都要使用IP地址方式,否則MySQL將無法正常處理連接請求#skip-networkingback_log = 600# MySQL能有的連接數量。當主要MySQL線程在一個很短時間內得到非常多的連接請求,這就起作用,# 然后主線程花些時間(盡管很短)檢查連接并且啟動一個新線程。back_log值指出在MySQL暫時停止回答新請求之前的短時間內多少個請求可以被存在堆棧中。# 如果期望在一個短時間內有很多連接,你需要增加它。也就是說,如果MySQL的連接數據達到max_connections時,新來的請求將會被存在堆棧中,# 以等待某一連接釋放資源,該堆棧的數量即back_log,如果等待連接的數量超過back_log,將不被授予連接資源。# 另外,這值(back_log)限于您的操作系統對到來的TCP/IP連接的偵聽隊列的大小。# 你的操作系統在這個隊列大小上有它自己的限制(可以檢查你的OS文檔找出這個變量的最大值),試圖設定back_log高于你的操作系統的限制將是無效的。max_connections = 1000# MySQL的最大連接數,如果服務器的并發連接請求量比較大,建議調高此值,以增加并行連接數量,當然這建立在機器能支撐的情況下,因為如果連接數越多,介于MySQL會為每個連接提供連接緩沖區,就會開銷越多的內存,所以要適當調整該值,不能盲目提高設值。可以過’conn%’通配符查看當前狀態的連接數量,以定奪該值的大小。max_connect_errors = 6000# 對于同一主機,如果有超出該參數值個數的中斷錯誤連接,則該主機將被禁止連接。如需對該主機進行解禁,執行:FLUSH HOST。open_files_limit = 65535# MySQL打開的文件描述符限制,默認最小1024;當open_files_limit沒有被配置的時候,比較max_connections*5和ulimit -n的值,哪個大用哪個,# 當open_file_limit被配置的時候,比較open_files_limit和max_connections*5的值,哪個大用哪個。table_open_cache = 128# MySQL每打開一個表,都會讀入一些數據到table_open_cache緩存中,當MySQL在這個緩存中找不到相應信息時,才會去磁盤上讀取。默認值64# 假定系統有200個并發連接,則需將此參數設置為200*N(N為每個連接所需的文件描述符數目);# 當把table_open_cache設置為很大時,如果系統處理不了那么多文件描述符,那么就會出現客戶端失效,連接不上max_allowed_packet = 4M# 接受的數據包大小;增加該變量的值十分安全,這是因為僅當需要時才會分配額外內存。例如,僅當你發出長查詢或MySQLd必須返回大的結果行時MySQLd才會分配更多內存。# 該變量之所以取較小默認值是一種預防措施,以捕獲客戶端和服務器之間的錯誤信息包,并確保不會因偶然使用大的信息包而導致內存溢出。binlog_cache_size = 1M# 一個事務,在沒有提交的時候,產生的日志,記錄到Cache中;等到事務提交需要提交的時候,則把日志持久化到磁盤。默認binlog_cache_size大小32Kmax_heap_table_size = 8M# 定義了用戶可以創建的內存表(memory table)的大小。這個值用來計算內存表的最大行數值。這個變量支持動態改變tmp_table_size = 16M# MySQL的heap(堆積)表緩沖大小。所有聯合在一個DML指令內完成,并且大多數聯合甚至可以不用臨時表即可以完成。# 大多數臨時表是基于內存的(HEAP)表。具有大的記錄長度的臨時表 (所有列的長度的和)或包含BLOB列的表存儲在硬盤上。# 如果某個內部heap(堆積)表大小超過tmp_table_size,MySQL可以根據需要自動將內存中的heap表改為基于硬盤的MyISAM表。還可以通過設置tmp_table_size選項來增加臨時表的大小。也就是說,如果調高該值,MySQL同時將增加heap表的大小,可達到提高聯接查詢速度的效果read_buffer_size = 2M# MySQL讀入緩沖區大小。對表進行順序掃描的請求將分配一個讀入緩沖區,MySQL會為它分配一段內存緩沖區。read_buffer_size變量控制這一緩沖區的大小。# 如果對表的順序掃描請求非常頻繁,并且你認為頻繁掃描進行得太慢,可以通過增加該變量值以及內存緩沖區大小提高其性能read_rnd_buffer_size = 8M# MySQL的隨機讀緩沖區大小。當按任意順序讀取行時(例如,按照排序順序),將分配一個隨機讀緩存區。進行排序查詢時,# MySQL會首先掃描一遍該緩沖,以避免磁盤搜索,提高查詢速度,如果需要排序大量數據,可適當調高該值。但MySQL會為每個客戶連接發放該緩沖空間,所以應盡量適當設置該值,以避免內存開銷過大sort_buffer_size = 8M# MySQL執行排序使用的緩沖大小。如果想要增加ORDER BY的速度,首先看是否可以讓MySQL使用索引而不是額外的排序階段。# 如果不能,可以嘗試增加sort_buffer_size變量的大小join_buffer_size = 8M# 聯合查詢操作所能使用的緩沖區大小,和sort_buffer_size一樣,該參數對應的分配內存也是每連接獨享thread_cache_size = 8# 這個值(默認8)表示可以重新利用保存在緩存中線程的數量,當斷開連接時如果緩存中還有空間,那么客戶端的線程將被放到緩存中,# 如果線程重新被請求,那么請求將從緩存中讀取,如果緩存中是空的或者是新的請求,那么這個線程將被重新創建,如果有很多新的線程,# 增加這個值可以改善系統性能.通過比較Connections和Threads_created狀態的變量,可以看到這個變量的作用。(–>表示要調整的值)# 根據物理內存設置規則如下:# 1G —> 8# 2G —> 16# 3G —> 32# 大于3G —> 64query_cache_size = 8M#MySQL的查詢緩沖大小(從4.0.1開始,MySQL提供了查詢緩沖機制)使用查詢緩沖,MySQL將SELECT語句和查詢結果存放在緩沖區中,# 今后對于同樣的SELECT語句(區分大小寫),將直接從緩沖區中讀取結果。根據MySQL用戶手冊,使用查詢緩沖最多可以達到238%的效率。# 通過檢查狀態值’Qcache_%’,可以知道query_cache_size設置是否合理:如果Qcache_lowmem_prunes的值非常大,則表明經常出現緩沖不夠的情況,# 如果Qcache_hits的值也非常大,則表明查詢緩沖使用非常頻繁,此時需要增加緩沖大小;如果Qcache_hits的值不大,則表明你的查詢重復率很低,# 這種情況下使用查詢緩沖反而會影響效率,那么可以考慮不用查詢緩沖。此外,在SELECT語句中加入SQL_NO_CACHE可以明確表示不使用查詢緩沖query_cache_limit = 2M#指定單個查詢能夠使用的緩沖區大小,默認1Mkey_buffer_size = 4M#指定用于索引的緩沖區大小,增加它可得到更好處理的索引(對所有讀和多重寫),到你能負擔得起那樣多。如果你使它太大,# 系統將開始換頁并且真的變慢了。對于內存在4GB左右的服務器該參數可設置為384M或512M。通過檢查狀態值Key_read_requests和Key_reads,# 可以知道key_buffer_size設置是否合理。比例key_reads/key_read_requests應該盡可能的低,# 至少是1:100,1:1000更好(上述狀態值可以使用SHOW STATUS LIKE ‘key_read%’獲得)。注意:該參數值設置的過大反而會是服務器整體效率降低ft_min_word_len = 4# 分詞詞匯最小長度,默認4transaction_isolation = REPEATABLE-READ# MySQL支持4種事務隔離級別,他們分別是:# READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE.# 如沒有指定,MySQL默認采用的是REPEATABLE-READ,ORACLE默認的是READ-COMMITTEDlog_bin = mysql-binbinlog_format = mixedexpire_logs_days = 30 #超過30天的binlog刪除log_error = /data/mysql/mysql-error.log #錯誤日志路徑slow_query_log = 1long_query_time = 1 #慢查詢時間 超過1秒則為慢查詢slow_query_log_file = /data/mysql/mysql-slow.logperformance_schema = 0explicit_defaults_for_timestamp#lower_case_table_names = 1 #不區分大小寫skip-external-locking #MySQL選項以避免外部鎖定。該選項默認開啟default-storage-engine = InnoDB #默認存儲引擎innodb_file_per_table = 1# InnoDB為獨立表空間模式,每個數據庫的每個表都會生成一個數據空間# 獨立表空間優點:# 1.每個表都有自已獨立的表空間。# 2.每個表的數據和索引都會存在自已的表空間中。# 3.可以實現單表在不同的數據庫中移動。# 4.空間可以回收(除drop table操作處,表空不能自已回收)# 缺點:# 單表增加過大,如超過100G# 結論:# 共享表空間在Insert操作上少有優勢。其它都沒獨立表空間表現好。當啟用獨立表空間時,請合理調整:innodb_open_filesinnodb_open_files = 500# 限制Innodb能打開的表的數據,如果庫里的表特別多的情況,請增加這個。這個值默認是300innodb_buffer_pool_size = 64M# InnoDB使用一個緩沖池來保存索引和原始數據, 不像MyISAM.# 這里你設置越大,你在存取表里面數據時所需要的磁盤I/O越少.# 在一個獨立使用的數據庫服務器上,你可以設置這個變量到服務器物理內存大小的80%# 不要設置過大,否則,由于物理內存的競爭可能導致操作系統的換頁顛簸.# 注意在32位系統上你每個進程可能被限制在 2-3.5G 用戶層面內存限制,# 所以不要設置的太高.innodb_write_io_threads = 4innodb_read_io_threads = 4# innodb使用后臺線程處理數據頁上的讀寫 I/O(輸入輸出)請求,根據你的 CPU 核數來更改,默認是4# 注:這兩個參數不支持動態改變,需要把該參數加入到my.cnf里,修改完后重啟MySQL服務,允許值的范圍從 1-64innodb_thread_concurrency = 0# 默認設置為 0,表示不限制并發數,這里推薦設置為0,更好去發揮CPU多核處理能力,提高并發量innodb_purge_threads = 1# InnoDB中的清除操作是一類定期回收無用數據的操作。在之前的幾個版本中,清除操作是主線程的一部分,這意味著運行時它可能會堵塞其它的數據庫操作。# 從MySQL5.5.X版本開始,該操作運行于獨立的線程中,并支持更多的并發數。用戶可通過設置innodb_purge_threads配置參數來選擇清除操作是否使用單# 獨線程,默認情況下參數設置為0(不使用單獨線程),設置為 1 時表示使用單獨的清除線程。建議為1innodb_flush_log_at_trx_commit = 2# 0:如果innodb_flush_log_at_trx_commit的值為0,log buffer每秒就會被刷寫日志文件到磁盤,提交事務的時候不做任何操作(執行是由mysql的master thread線程來執行的。# 主線程中每秒會將重做日志緩沖寫入磁盤的重做日志文件(REDO LOG)中。不論事務是否已經提交)默認的日志文件是ib_logfile0,ib_logfile1# 1:當設為默認值1的時候,每次提交事務的時候,都會將log buffer刷寫到日志。# 2:如果設為2,每次提交事務都會寫日志,但并不會執行刷的操作。每秒定時會刷到日志文件。要注意的是,并不能保證100%每秒一定都會刷到磁盤,這要取決于進程的調度。# 每次事務提交的時候將數據寫入事務日志,而這里的寫入僅是調用了文件系統的寫入操作,而文件系統是有 緩存的,所以這個寫入并不能保證數據已經寫入到物理磁盤# 默認值1是為了保證完整的ACID。當然,你可以將這個配置項設為1以外的值來換取更高的性能,但是在系統崩潰的時候,你將會丟失1秒的數據。# 設為0的話,mysqld進程崩潰的時候,就會丟失最后1秒的事務。設為2,只有在操作系統崩潰或者斷電的時候才會丟失最后1秒的數據。InnoDB在做恢復的時候會忽略這個值。# 總結# 設為1當然是最安全的,但性能頁是最差的(相對其他兩個參數而言,但不是不能接受)。如果對數據一致性和完整性要求不高,完全可以設為2,如果只最求性能,例如高并發寫的日志服務器,設為0來獲得更高性能innodb_log_buffer_size = 2M# 此參數確定些日志文件所用的內存大小,以M為單位。緩沖區更大能提高性能,但意外的故障將會丟失數據。MySQL開發人員建議設置為1-8M之間innodb_log_file_size = 32M# 此參數確定數據日志文件的大小,更大的設置可以提高性能,但也會增加恢復故障數據庫所需的時間innodb_log_files_in_group = 3# 為提高性能,MySQL可以以循環方式將日志文件寫到多個文件。推薦設置為3innodb_max_dirty_pages_pct = 90# innodb主線程刷新緩存池中的數據,使臟數據比例小于90%innodb_lock_wait_timeout = 120# InnoDB事務在被回滾之前可以等待一個鎖定的超時秒數。InnoDB在它自己的鎖定表中自動檢測事務死鎖并且回滾事務。InnoDB用LOCK TABLES語句注意到鎖定設置。默認值是50秒bulk_insert_buffer_size = 8M# 批量插入緩存大小, 這個參數是針對MyISAM存儲引擎來說的。適用于在一次性插入100-1000+條記錄時, 提高效率。默認值是8M。可以針對數據量的大小,翻倍增加。myisam_sort_buffer_size = 8M# MyISAM設置恢復表之時使用的緩沖區的尺寸,當在REPAIR TABLE或用CREATE INDEX創建索引或ALTER TABLE過程中排序 MyISAM索引分配的緩沖區myisam_max_sort_file_size = 10G# 如果臨時文件會變得超過索引,不要使用快速排序索引方法來創建一個索引。注釋:這個參數以字節的形式給出myisam_repair_threads = 1# 如果該值大于1,在Repair by sorting過程中并行創建MyISAM表索引(每個索引在自己的線程內)interactive_timeout = 28800# 服務器關閉交互式連接前等待活動的秒數。交互式客戶端定義為在mysql_real_connect()中使用CLIENT_INTERACTIVE選項的客戶端。默認值:28800秒(8小時)wait_timeout = 28800# 服務器關閉非交互連接之前等待活動的秒數。在線程啟動時,根據全局wait_timeout值或全局interactive_timeout值初始化會話wait_timeout值,# 取決于客戶端類型(由mysql_real_connect()的連接選項CLIENT_INTERACTIVE定義)。參數默認值:28800秒(8小時)# MySQL服務器所支持的最大連接數是有上限的,因為每個連接的建立都會消耗內存,因此我們希望客戶端在連接到MySQL Server處理完相應的操作后,# 應該斷開連接并釋放占用的內存。如果你的MySQL Server有大量的閑置連接,他們不僅會白白消耗內存,而且如果連接一直在累加而不斷開,# 最終肯定會達到MySQL Server的連接上限數,這會報’too many connections’的錯誤。對于wait_timeout的值設定,應該根據系統的運行情況來判斷。# 在系統運行一段時間后,可以通過show processlist命令查看當前系統的連接狀態,如果發現有大量的sleep狀態的連接進程,則說明該參數設置的過大,# 可以進行適當的調整小些。要同時設置interactive_timeout和wait_timeout才會生效。[mysqldump]quickmax_allowed_packet = 16M #服務器發送和接受的最大包長度[myisamchk]key_buffer_size = 8Msort_buffer_size = 8Mread_buffer = 4Mwrite_buffer = 4M

附錄:

1、查看innodb的相關參數信息

show variables like 'innodb%';

2、查看innodb的相關參數狀態

show status like 'innodb%';

五、MySQL的執行順序

MySQL的語句一共分為11步,如下圖所標注的那樣,最先執行的總是FROM操作,最后執行的是LIMIT操作。其中每一個操作都會產生一張虛擬的表,這個虛擬的表作為一個處理的輸入,只是這些虛擬的表對用戶來說是透明的,但是只有最后一個虛擬的表才會被作為結果返回。如果沒有在語句中指定某一個子句,那么將會跳過相應的步驟。

下面我們來具體分析一下查詢處理的每一個階段

1.FORM: 對FROM的左邊的表和右邊的表計算笛卡爾積。產生虛表VT1

2.ON: 對虛表VT1進行ON篩選,只有那些符合的行才會被記錄在虛表VT2中。

3.JOIN: 如果指定了OUTER JOIN(比如left join、 right join),那么保留表中未匹配的行就會作為外部行添加到虛擬表VT2中,產生虛擬表VT3, rug from子句中包含兩個以上的表的話,那么就會對上一個join連接產生的結果VT3和下一個表重復執行步驟1~3這三個步驟,一直到處理完所有的表為止。

4.WHERE: 對虛擬表VT3進行WHERE條件過濾。只有符合的記錄才會被插入到虛擬表VT4中。

5.GROUP BY: 根據group by子句中的列,對VT4中的記錄進行分組操作,產生VT5.

6.CUBE | ROLLUP: 對表VT5進行cube或者rollup操作,產生表VT6.

7.HAVING: 對虛擬表VT6應用having過濾,只有符合的記錄才會被 插入到虛擬表VT7中。

六、MySQL執行引擎介紹(了解)

1、MyISAM存儲引擎

不支持事務、也不支持外鍵,優勢是訪問速度快,對事務完整性沒有 要求或者以select,insert為主的應用基本上可以用這個引擎來創建表

支持3種不同的存儲格式,分別是:靜態表;動態表;壓縮表

靜態表:

表中的字段都是非變長字段,這樣每個記錄都是固定長度的,優點存儲非常迅速,容易緩存,出現故障容易恢復;缺點是占用的空間通常比動態表多(因為存儲時會按照列的寬度定義補足空格)ps:在取數據的時候,默認會把字段后面的空格去掉,如果不注意會把數據本身帶的空格也會忽略。

動態表:

記錄不是固定長度的,這樣存儲的優點是占用的空間相對較少;缺點:頻繁的更新、刪除數據容易產生碎片,需要定期執行OPTIMIZE TABLE或者myisamchk-r命令來改善性能

壓縮表:

因為每個記錄是被單獨壓縮的,所以只有非常小的訪問開支

2、InnoDB存儲引擎

該存儲引擎提供了具有提交、回滾和崩潰恢復能力的事務安全。但是對比MyISAM引擎,寫的處理效率會差一些,并且會占用更多的磁盤空間以保留數據和索引。

InnoDB存儲引擎的特點:支持自動增長列,支持外鍵約束

3、MEMORY存儲引擎

Memory存儲引擎使用存在于內存中的內容來創建表。每個memory表只實際對應一個磁盤文件,格式是.frm。memory類型的表訪問非常的快,因為它的數據是放在內存中的,并且默認使用HASH索引,但是一旦服務關閉,表中的數據就會丟失掉。

MEMORY存儲引擎的表可以選擇使用BTREE索引或者HASH索引,兩種不同類型的索引有其不同的使用范圍

Hash索引優點:

Hash 索引結構的特殊性,其檢索效率非常高,索引的檢索可以一次定位,不像B-Tree 索引需要從根節點到枝節點,最后才能訪問到頁節點這樣多次的IO訪問,所以 Hash 索引的查詢效率要遠高于 B-Tree 索引。

Hash索引缺點:

那么不精確查找呢,也很明顯,因為hash算法是基于等值計算的,所以對于“like”等范圍查找hash索引無效,不支持;

Memory類型的存儲引擎主要用于哪些內容變化不頻繁的代碼表,或者作為統計操作的中間結果表,便于高效地對中間結果進行分析并得到最終的統計結果,。對存儲引擎為memory的表進行更新操作要謹慎,因為數據并沒有實際寫入到磁盤中,所以一定要對下次重新啟動服務后如何獲得這些修改后的數據有所考慮。

4、MERGE存儲引擎

Merge存儲引擎是一組MyISAM表的組合,這些MyISAM表必須結構完全相同,merge表本身并沒有數據,對merge類型的表可以進行查詢,更新,刪除操作,這些操作實際上是對內部的MyISAM表進行的。

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的mysql 按日期拆分成多条记录_mysql性能优化2 设计规范 设计原则 结构优化 拆分 配置优化...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。