mysql 最佳化(1)表的最佳化與列類型選擇
表的最佳化:
1: 定長與變長分離
如id int, 佔4個位元組, char(4)佔4個字元長度,也是定長,
time 即每一單元值佔的位元組是固定的.
核心且常用字段,宜建成定長,放在一張表. 而varchar,
text,blob,這種變長字段,適合單放一張表,用主鍵與核心表關聯起來.
sql 執行查詢100000條資料會因為所有都是定常而跳過的非常迅速
2:常用字段和不常用字段要分離.
需要結合網站具體的業務來分析,分析字段的查詢場景,查詢頻度低的字段,單拆出來.
3:在1對多,需要關聯統計的字段上,添加冗餘字段.
減少關聯查詢
看如下BBS的效果統計的發帖數不要數而是透過在欄位下的添加冗餘字段,每次發文章更新文章數+1 這樣就會減少查詢強度
列選擇原則:
1:字段類型優先級整數> date,time > enum,char>varchar > blob,text
列的特徵分析:整數:定長,沒有國家/地區之分,沒有字符集的差異
比如tinyint 1,2,3,4,5 char(1) a,b,c,d,e, 從空間上,都是佔1個位元組,但是order
by 排序,前者快
原因: 後者需要考慮字符集與校對集(就是排序規則)
time定長,運算快,節省空間. 考慮時區,寫sql時不方便where
> '2005-10-12'; 時間存int 型;
enum: 能起來約束值的目的, 內部約束值的目的, 內部用整型來儲存,但與char聯查時,內部要經歷串與值的轉換
Char 定長, 考慮字符集和(排序)校對集
varchar, 不定長要考慮字符集的轉換與排序時的校對集,速度慢.
text/Blob 無法使用記憶體臨時表(排序等操作只能在磁碟上進行)
性別: 以utf8為例
char(1) , 3個字長位元組
enum ('男','女'); // 內部轉成數字來存,多了一個轉換過程
tinyint() , // 0 1 2 // 定長1個位元組.
sql 最佳化書籍《 MYSQL 高效能最佳化》
關於date/time的選擇,大師的明確意見,直接選int unsgined not null ,儲存時間戳http://www.xaprb.com/blog/2014/01/30/timestamps-in -mysql/
時間--->存成整型
2: 恰好夠用就行,不要慷慨(如smallint,varchar(N))
原因: 大的字段浪費內存,影響速度,
以年齡為例tinyint unsigned not null ,可以儲存255歲,足夠.用int浪費了3個位元組
以varchar(10) ,varchar(300)儲存的內容相同,但在表聯查時,varchar(300 )要花更多記憶體
3: 盡量避免用NULL()
原因: NULL不利於索引,要用特殊的字節來標註.
在磁碟上佔據的空間其實更大.(mysql5.7已對null做的改進,但查詢仍是不便)
實驗:
可以建立2張字段相同的表,一個允許為null,一個不允許為Null,各加入1萬條,查看索引文件的大小.可以發現,為null的索引要大些.(mysql5.5裡,關於null已經做了優化,大小區別已不明顯)
另外: null也不便於查詢,
where 列名=null;
where 列名!=null;都查不到值,
where 列名is null ,或is not null才可以查詢.
create table dictnn ( id int, word varchar(14) not null default '', key(word) )engine myisam charset utf8;
create table dictyn ( id int, word varchar(14), key(word) )engine myisam charset utf8;
alter table dictnn disable keys; alter table dictyn disable keys;
insert into dictnn select id,if(id%2,word,'') from dict limit 10000; insert into dictyn select id,if(id%2,word,null) from dict limit 10000;
alert table dictnn enable keys; alter table dictyn enable keys;
create table t2 ( id int, gender enum('man','woman'), key(gender) )engine myisam charset utf8;
create table t3 ( id int, gender char(5) not null default '', key(gender) )engine myisam charset utf8;
alter table t2 disable keys; alter table t3 disable keys;
insert into t2 select id,if(id%2,'man','woman') from dict limit 10000; insert into t3 select id,if(id%2,'man','woman') from dict limit 10000;
alter table t2 enable keys; alter table t3 enable keys; mysql> select count(*) from t2 as ta,t2 as tb where ta.gender=tb.gender mysql> select count(*) from t3 as ta,t3 as tb where ta.gender=tb.gender
用整型來儲存的
2: enum列與enum列相關聯速度最快
3: enum列比(var)char的弱勢---在碰到與char關聯時,要轉化.要花時間.
4: 優點在於,當char非常長時,enum依然是整型固定長度.
當查詢的資料量越大時,enum的優勢越明顯.
5: enum與char/varchar關聯,因為要轉換,速度要比enum->enum,char->char要慢,
但有時也這樣用-----就是在數據量特別大時,可以節省IO.
試驗:
rrreeerrreeerrreeerrreeerrreee
列列
時間
Enumenum
10.5335333333353337
Enumchar
18.22
如果t2表的優勢不明顯,加大t3的gender列,char(15),
char(20)... t2表優勢逐漸明顯.
原因----無論enum('manmaman','womanwomanwoman')枚舉的字符多長,
內部都是用整型表示, 在內存中產生的數據大小不變,
而char型,卻在記憶體中產生的資料越來越多.
總結: enum 和enum類型關聯速度比較快
Enum 類型節省了IO
以上是mysql 最佳化(以上就是mysql )表格的最佳化與列類型選擇的內容,更多相關內容請關注PHP中文網(www.php.cn)!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

如何透過MySQL對AVG函數最佳化來提高效能MySQL是一款流行的關聯式資料庫管理系統,其中包含了許多強大的函數以及功能。其中AVG函數被廣泛使用在計算平均值的情形,但由於這個函數需要遍歷整個資料集,所以在大規模資料的情況下會導致效能問題。本文將詳細介紹如何透過MySQL對AVG函數進行最佳化,進而提高效能。 1.使用索引索引是MySQL最佳化中最重要的一部分,

基於TokuDB引擎的MySQL最佳化:提升寫入與壓縮效能引言:MySQL作為一種常用的關聯式資料庫管理系統,在大數據時代的脈絡下,面臨越來越高的寫入壓力和儲存需求。為了應對這項挑戰,TokuDB引擎應運而生。本文將介紹如何利用TokuDB引擎來提升MySQL的寫入效能與壓縮效能。一、什麼是TokuDB引擎? TokuDB引擎是一種面向大數據的、用於處理高寫入

MySQL是一種廣泛使用的關聯式資料庫管理系統,常用於Web應用程式的開發與資料儲存。在實際應用中,對MySQL的底層最佳化特別重要,其中SQL語句的高階最佳化是提升資料庫效能的關鍵所在。本文將介紹實現MySQL底層優化的一些技巧和最佳實踐,以及具體的程式碼範例。確定查詢條件在編寫SQL語句時,首先要明確定義查詢條件,避免使用無限制的通配符查詢,即避免使用"%"開

MySQL是一種廣泛應用於電子商務領域的關聯式資料庫管理系統。在電子商務應用中,對MySQL進行最佳化和安全工作是至關重要的。本文將解析MySQL在電子商務應用中的最佳化與安全專案經驗。一、效能最佳化資料庫架構設計:在電子商務應用中,資料庫的設計是關鍵。合理的表結構設計和索引設計能夠提高資料庫的查詢效能。同時,使用分錶和分區技術可以減少單一表的資料量,並提高查詢效率

如何優化MySQL連線數管理MySQL是一種流行的關聯式資料庫管理系統,廣泛應用於各種網站和應用程式。在實際的應用過程中,MySQL連線數管理是一個非常重要的問題,尤其是在高並發情況下,合理管理連線數可以提高系統的效能和穩定性。本文將介紹如何最佳化MySQL連線數管理,包括詳細的程式碼範例。一、理解連線數管理在MySQL中,連線數是指系統能夠同時連

最佳化MySQL查詢效能:從儲存引擎到查詢語句的全方位技巧摘要:MySQL是一個廣泛使用的開源關係型資料庫管理系統,是許多應用程式的首選資料庫。但是,隨著資料量的增加和查詢負載的增加,查詢效能可能會成為一個問題。本文將介紹一系列的最佳化技巧,從儲存引擎的選擇到查詢語句的最佳化,有助於提升MySQL的查詢效能。使用合適的儲存引擎MySQL提供了多種儲存引擎,如M

MySQL是一種廣泛使用的開源資料庫管理系統,用於儲存和管理大量資料。但是,使用MySQL時,您可能會遇到各種各樣的問題,從簡單的語法錯誤到更複雜的效能問題和故障。在本文中,我們將探討一些最常見的MySQL問題和解決方法。連線問題連線問題很常見。如果您無法連線到MySQL伺服器,請檢查以下幾點:1)MySQL伺服器是否正在執行2)網路連線是否正常3)MySQ

如何合理配置和最佳化MySQL的雙寫緩衝技術引言:MySQL的雙寫緩衝技術是一種提高資料安全性和效能的重要技術。本文將介紹如何合理配置和最佳化MySQL的雙寫緩衝技術,以便更好地保護數據,並提升資料庫的效能。一、什麼是雙寫緩衝技術雙寫緩衝技術是MySQL的一種I/O最佳化技術,它可以大幅減少磁碟I/O操作的次數,提高資料庫的寫入效能。當MySQL執行寫入操作時,先
