Mysql優化之建表原則

2021-09-08 02:41:01 字數 1326 閱讀 7904

1.定長與變長分離

如 id int佔4個位元組,char(4) 佔4個字元長度,也是定長,time即每一單元值佔的位元組是固定的

核心且常用字段,直建成定長,方在一張表上

而 varchar,text,blob這種變長字段,適合單方一章表,用主鍵與核心表關聯起來

2.常用字段要與非常用字段分離

需要結合**的具體業務分析,分析欄位的查詢場景,查詢頻率低的字段單拆出來

3.在1對多需要關聯統計的字段,新增冗餘字段

例如,欄目組要查詢欄目組下面的文章數量,如果沒有冗餘字段,就需要關聯查詢

可以在欄目表中新增章節數量字段,可以避免關聯查詢

1.欄位型別優先順序

整型 > date,time > emum char > varchar > blob,text

2.列特點分析

(1) 整型:定長,沒有國家/地區之分,沒有字符集差異

比如,tinyint 1 2 3 4 <==> char(1) a b c d

從空間上看都是一位元組,但是order by 排序tinyint快

原因:後者需要考慮字符集與校對集(就是排序優先集)

time : 定長運算快,節省時間,考慮時區,寫sql不方便

enum : 能約束值的目的,內部用整形來儲存,但與char聯查時,內部要經歷串與值的轉化

char : 定長,考慮字符集和校對集

varchar : 不定長,要考慮字符集的轉換與排序時的校對集,速度慢

text,blob : 無法使用記憶體臨時表(排序操作只能在磁碟上進行)

注意:date,time的選擇可以直接選擇使用時間戳

char(1),3個位元組

enum("男","女") //內部轉成數字來儲存,多了乙個轉換的過程

tinyint() // 0 1 2 定長1位元組

(2)夠用就行不要慷慨

大的字段影響記憶體影響速度

以年齡為例:tinyint unsigned not null;可以儲存255歲,足夠了,用int浪費3個位元組

以varchar(10),varchar(300)儲存的內容相同,但在表中查詢時,varhcar(300)要花用更多記憶體

(3)盡量避免null()

null不利於索引,要用到特殊位元組來標註

(在磁碟上佔據記憶體更大,mysql5.5已經做過優化,但是還是不便)

null也不便於查詢,=null 或者 != null 都查詢不到值,只有使用 is null 或者 is not null 才可以

可以在建立字段時候使用 not null default "" 的形式

mysql建表原則 mysql優化1 建表原則

建表三大原則 定長和變長分離 常用字段和不常用字段分離 使用冗餘欄位或冗餘表 1 定長與變長分離 如 id int,佔4個位元組,char 4 佔4個字元長度,也是定長,time 即每乙個單元值佔的位元組是固定的。在磁碟上查詢時,由於每一行長度固定,比如長度為10000,查下一條時只需查 10001...

mysql建表效能優化 MYSQL建表優化

除非單錶資料未來會一直不斷 否則不要一開始就考慮拆分,拆分會帶來邏輯 部署 運維的各種複雜度,一般以整型值為主的表在千萬級以下,字串為主的表在五百萬以下是沒有太大問題的。1 字段 a 盡量使用tinyint smallint medium int作為整數型別而非int,如果非負則加上unsigned...

mysql 建表原則 MySql基本的建表原則

1.定長和變長的分離 如int,char,time所佔位元組是固定的字段放在一張表 如varchar,text所佔位元組不確定的字段放在一張表中 2.常用字段和不常用字段進行分離,根據查詢頻率來設計 3.一對多的關聯表可以新增冗餘字段,如商品分類表 和商品表 在首頁中需要顯示每個分類商品總數.解決方...