如果你表中已經(jīng)設(shè)為自增長(zhǎng)了,還調(diào)什么,取決于當(dāng)時(shí)建表時(shí)你所選的數(shù)據(jù)類型
成都創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站制作、成都網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的鄂州網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
你這樣做下試試
set IDENTITY_INSERT 表名 ON
找到最大號(hào),用語(yǔ)句插入數(shù)據(jù)插數(shù)據(jù)
SET IDENTITY_INSERT 表名 OFF
再用語(yǔ)句把插入的數(shù)據(jù)刪除
如果還不行的話,有一個(gè)想法,根據(jù)原表的建表語(yǔ)句,再建一個(gè)新表,定義identity屬性時(shí)注意數(shù)據(jù)類型后不要加長(zhǎng)度限制,建好表后把原表中的數(shù)據(jù)插入新建表中,再把原表刪除,把新建表改名稱。
命令:mysqlhotcopy
這個(gè)命令會(huì)在拷貝文件之前會(huì)把表鎖住,并把數(shù)據(jù)同步到數(shù)據(jù)文件中,以避免拷貝到不完整的數(shù)據(jù)文件,是最安全快捷的備份方法。
命令的使用方法是:
mysqlhotcopy -u root -prootpass db1 db2 … dbn output_dir
如果需要備份全部數(shù)據(jù)庫(kù),可以加上–regexp=”.*”參數(shù)。
Mysqlhotcopy命令可自動(dòng)完成數(shù)據(jù)鎖定工作,備份時(shí)不用關(guān)閉服務(wù)器。
它還可以刷新日志,使備份文件和日志文件的檢查點(diǎn)能保持同步。
mysql創(chuàng)建表字段長(zhǎng)度范圍_Mysql的建表規(guī)范與注意事項(xiàng)?、 表設(shè)計(jì)規(guī)范
庫(kù)名、表名、字段名必須使??寫字母,“_”分割。
庫(kù)名、表名、字段名必須不超過(guò)12個(gè)字符。
庫(kù)名、表名、字段名見(jiàn)名知意,建議使?名詞?不是動(dòng)詞。
建議使?InnoDB存儲(chǔ)引擎。
存儲(chǔ)精確浮點(diǎn)數(shù)必須使?DECIMAL替代FLOAT和DOUBLE。
建議使?UNSIGNED存儲(chǔ)?負(fù)數(shù)值。
建議使?INT UNSIGNED存儲(chǔ)IPV4。
整形定義中不添加長(zhǎng)度,?如使?INT,?不是INT(4)。
使?短數(shù)據(jù)類型,?如取值范圍為0-80時(shí),使?TINYINT UNSIGNED。
不建議使?ENUM類型,使?TINYINT來(lái)代替。
盡可能不使?TEXT、BLOB類型。
VARCHAR(N),N表?的是字符數(shù)不是字節(jié)數(shù),?如VARCHAR(255),可以最?可存儲(chǔ)255個(gè)漢字,需要根據(jù)實(shí)際的寬度來(lái)選擇N。
VARCHAR(N),N盡可能?,因?yàn)镸ySQL?個(gè)表中所有的VARCHAR字段最?長(zhǎng)度是65535個(gè)字節(jié),進(jìn)?排序和創(chuàng)建臨時(shí)表?類的內(nèi)存操作時(shí),會(huì)使?N的長(zhǎng)度申請(qǐng)內(nèi)存。
表字符集選擇UTF8。
使?VARBINARY存儲(chǔ)變長(zhǎng)字符串。
存儲(chǔ)年使?YEAR類型。
存儲(chǔ)?期使?DATE類型。
存儲(chǔ)時(shí)間(精確到秒)建議使?TIMESTAMP類型,因?yàn)門IMESTAMP使?4字節(jié),DATETIME使?8個(gè)字節(jié)。
建議字段定義為NOT NULL。
將過(guò)?字段拆分到其他表中。
禁?在數(shù)據(jù)庫(kù)中使?VARBINARY、BLOB存儲(chǔ)圖?、?件等。
表結(jié)構(gòu)變更需要通知DBA審核。
?、 索引規(guī)范
?唯?索引必須按照“idx_字段名稱_字段名稱[_字段名]”進(jìn)?命名。
唯?索引必須按照“uniq_字段名稱_字段名稱[_字段名]”進(jìn)?命名。
索引名稱必須使??寫。
索引中的字段數(shù)建議不超過(guò)5個(gè)。
單張表的索引數(shù)量控制在5個(gè)以內(nèi)。
唯?鍵由3個(gè)以下字段組成,并且字段都是整形時(shí),使?唯?鍵作為主鍵。
沒(méi)有唯?鍵或者唯?鍵不符合5中的條件時(shí),使??增(或者通過(guò)發(fā)號(hào)器獲取)id作為主鍵。
唯?鍵不和主鍵重復(fù)。
索引字段的順序需要考慮字段值去重之后的個(gè)數(shù),個(gè)數(shù)多的放在前?。
ORDER BY,GROUP BY,DISTINCT的字段需要添加在索引的后?。
使?EXPLAIN判斷SQL語(yǔ)句是否合理使?索引,盡量避免extra列出現(xiàn):Using File Sort,UsingTemporary。
UPDATE、DELETE語(yǔ)句需要根據(jù)WHERE條件添加索引。
不建議使?%前綴模糊查詢,例如LIKE “%weibo”。
對(duì)長(zhǎng)度過(guò)長(zhǎng)的VARCHAR字段建?索引時(shí),添加crc32或者M(jìn)D5 Hash字段,對(duì)Hash字段建?索引。
合理創(chuàng)建聯(lián)合索引(避免冗余),(a,b,c) 相當(dāng)于 (a) 、(a,b) 、(a,b,c)。
合理利?覆蓋索引。
SQL變更需要確認(rèn)索引是否需要變更并通知DBA。
三、 SQL語(yǔ)句規(guī)范
使?prepared statement,可以提供性能并且避免SQL注?。
SQL語(yǔ)句中IN包含的值不應(yīng)過(guò)多。
UPDATE、DELETE語(yǔ)句不使?LIMIT。
WHERE條件中必須使?合適的類型,避免MySQL進(jìn)?隱式類型轉(zhuǎn)化。
SELECT語(yǔ)句只獲取需要的字段。
SELECT、INSERT語(yǔ)句必須顯式的指明字段名稱,不使?SELECT *,不使?INSERTINTO table()。
使 ?SELECT column_name1, column_name2 FROM table WHERE[condition]?不是SELECT column_name1 FROM table WHERE[condition]和SELECT column_name2 FROM table WHERE [condition]。
WHERE條件中的?等值條件(IN、BETWEEN、、=)會(huì)導(dǎo)致后?的條件使?不了索引。
避免在SQL語(yǔ)句進(jìn)?數(shù)學(xué)運(yùn)算或者函數(shù)運(yùn)算,容易將業(yè)務(wù)邏輯和DB耦合在?起。
INSERT語(yǔ)句使?batch提交(INSERT INTO tableVALUES(),(),()……),values的個(gè)數(shù)不應(yīng)過(guò)多。
避免使?存儲(chǔ)過(guò)程、觸發(fā)器、函數(shù)等,容易將業(yè)務(wù)邏輯和DB耦合在?起,并且MySQL的存儲(chǔ)過(guò)程、觸發(fā)器、函數(shù)中存在?定的bug。
避免使?JOIN。
使?合理的SQL語(yǔ)句減少與數(shù)據(jù)庫(kù)的交互次數(shù)。
不使?ORDER BY RAND(),使?其他?法替換。
建議使?合理的分頁(yè)?式以提?分頁(yè)的效率。
統(tǒng)計(jì)表中記錄數(shù)時(shí)使?COUNT(*),?不是COUNT(primary_key)和COUNT(1)。
禁?在從庫(kù)上執(zhí)?后臺(tái)管理和統(tǒng)計(jì)類型功能的QUERY。
四、 散表規(guī)范
每張表數(shù)據(jù)量建議控制在5000w以下。
可以結(jié)合使?hash、range、lookup table進(jìn)?散表。
散表如果使?md5(或者類似的hash算法)進(jìn)?散表,表名后綴使?16進(jìn)制,?如user_ff。
推薦使?CRC32求余(或者類似的算術(shù)算法)進(jìn)?散表,表名后綴使?數(shù)字,數(shù)字必須從0開(kāi)始并等寬,?如散100張表,后綴從00-99。
使?時(shí)間散表,表名后綴必須使?特定格式,?如按?散表user_20110209、按?散表user_201102。
五、 其他
批量導(dǎo)?、導(dǎo)出數(shù)據(jù)需要DBA進(jìn)?審查,并在執(zhí)?過(guò)程中觀察服務(wù)。
批量更新數(shù)據(jù),如update,delete 操作,需要DBA進(jìn)?審查,并在執(zhí)?過(guò)程中觀察服務(wù)。
產(chǎn)品出現(xiàn)?數(shù)據(jù)庫(kù)平臺(tái)運(yùn)維導(dǎo)致的問(wèn)題和故障時(shí),如前端被抓站,請(qǐng)及時(shí)通知DBA,便于維護(hù)服務(wù)穩(wěn)定。
業(yè)務(wù)部門程序出現(xiàn)bug等影響數(shù)據(jù)庫(kù)服務(wù)的問(wèn)題,請(qǐng)及時(shí)通知DBA,便于維護(hù)服務(wù)穩(wěn)定。
業(yè)務(wù)部門推?活動(dòng),請(qǐng)?zhí)崆巴ㄖ狣BA進(jìn)?服務(wù)和訪問(wèn)評(píng)估。
如果出現(xiàn)業(yè)務(wù)部門?為誤操作導(dǎo)致數(shù)據(jù)丟失,需要恢復(fù)數(shù)據(jù),請(qǐng)?jiān)诘?時(shí)間通知DBA,并提供準(zhǔn)確時(shí)間,誤操作語(yǔ)句等重要線索。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
FAQ
1-1.庫(kù)名、表名、字段名必須使??寫字母,“_”分割。
a)MySQL有配置參數(shù)lower_case_table_names,不可動(dòng)態(tài)更改,Linux系統(tǒng)默認(rèn)為0,即庫(kù)表名以實(shí)際情況存儲(chǔ),??寫敏感。如果是1,以?寫存儲(chǔ),??寫不敏感。如果是2,以實(shí)際情況存儲(chǔ),但以?寫?較。
b) 如果??寫混合?,可能存在abc,Abc,ABC等多個(gè)表共存,容易導(dǎo)致混亂。
c) 字段名顯?區(qū)分??寫,但實(shí)際使?不區(qū)分,即不可以建?兩個(gè)名字?樣但??寫不?樣的字段。
d) 為了統(tǒng)?規(guī)范, 庫(kù)名、表名、字段名使??寫字母。
1-2.庫(kù)名、表名、字段名必須不超過(guò)12個(gè)字符。
庫(kù)名、表名、字段名?持最多64個(gè)字符,但為了統(tǒng)?規(guī)范、易于辨識(shí)以及減少傳輸量,必須不超過(guò)12字符。
1-3.庫(kù)名、表名、字段名見(jiàn)名知意,建議使?名詞?不是動(dòng)詞。
a) ?戶評(píng)論可?表名usercomment或者comment。
b) 庫(kù)表是?種客觀存在的事物,?種對(duì)象,所以建議使?名詞。
1-4.建議使?InnoDB存儲(chǔ)引擎。
a) 5.5以后的默認(rèn)引擘,?持事務(wù),?級(jí)鎖,更好的恢復(fù)性,?并發(fā)下性能更好,對(duì)多核,?內(nèi)存,ssd等硬件?持更好。
b) 具體?較可見(jiàn)附件的官???書(shū)。
1-5.存儲(chǔ)精確浮點(diǎn)數(shù)必須使?DECIMAL替代FLOAT和DOUBLE。
a) mysql中的數(shù)值類型(不包括整型):
IEEE754浮點(diǎn)數(shù):float (單精度) , double 或real (雙精度)
定點(diǎn)數(shù): decimal或 numeric
單精度浮點(diǎn)數(shù)的有效數(shù)字?進(jìn)制是24位,按?進(jìn)制來(lái)說(shuō),是8位;雙精度浮點(diǎn)數(shù)的有效數(shù)字?進(jìn)制是53位,按?進(jìn)制來(lái)說(shuō),是16 位
?個(gè)實(shí)數(shù)的有效數(shù)字超過(guò)8位,?單精度浮點(diǎn)數(shù)來(lái)表?的話,就會(huì)產(chǎn)?誤差!同樣,如果?個(gè)實(shí)數(shù)的有效數(shù)字超過(guò)16位,?雙精度浮點(diǎn)數(shù)來(lái)表?,也會(huì)產(chǎn)?誤差
b)IEEE754標(biāo)準(zhǔn)的計(jì)算機(jī)浮點(diǎn)數(shù),在內(nèi)部是??進(jìn)制表?的,但在將?個(gè)?進(jìn)制數(shù)轉(zhuǎn)換為?進(jìn)制浮點(diǎn)數(shù)時(shí),也會(huì)造成誤差,原因是不是所有的數(shù)都能轉(zhuǎn)換成有限長(zhǎng)度的?進(jìn)制數(shù)。
即?個(gè)?進(jìn)制可以準(zhǔn)確轉(zhuǎn)換成?進(jìn)制,但?個(gè)帶?數(shù)的?進(jìn)制不?定能夠準(zhǔn)確地??進(jìn)制來(lái)表?。
實(shí)例:
drop table if exists t;
create table t(value float(10,2));
insert into t values(131072.67),(131072.68);
select value from t;
+-----------+
|value |
+-----------+
| 131072.67 |
| 131072.69 |
+-----------+
1-6.建議使?UNSIGNED存儲(chǔ)?負(fù)數(shù)值。
同樣的字節(jié)數(shù),存儲(chǔ)的數(shù)值范圍更?。如tinyint 有符號(hào)為 -128-127,?符號(hào)為0-255
1-7. 如何使?INT UNSIGNED存儲(chǔ)ip?
使?INTUNSIGNED?不是char(15)來(lái)存儲(chǔ)ipv4地址,通過(guò)MySQL函數(shù)inet_ntoa和inet_aton來(lái)進(jìn)?轉(zhuǎn)化。Ipv6地址?前沒(méi)有轉(zhuǎn)化函數(shù),需要使?DECIMAL或者兩個(gè)bigINT來(lái)存儲(chǔ)。例如:
SELECT INET_ATON('209.207.224.40');
3520061480
SELECT INET_NTOA(3520061480);
209.207.224.40
1-8. INT[M],M值代表什么含義?
注意數(shù)值類型括號(hào)后?的數(shù)字只是表?寬度?跟存儲(chǔ)范圍沒(méi)有關(guān)系,?如INT(3)默認(rèn)顯?3位,空格補(bǔ)齊,超出時(shí)正常顯?,Python、Java客戶端等不具備這個(gè)功能。
1-10.不建議使?ENUM、SET類型,使?TINYINT來(lái)代替。
a)ENUM,有三個(gè)問(wèn)題:添加新的值要做DDL,默認(rèn)值問(wèn)題(將?個(gè)?法值插?ENUM(也就是說(shuō),允許的值列之外的字符串),將插?空字符串以作為特殊錯(cuò)誤值),索引值問(wèn)題(插?數(shù)字實(shí)際是插?索引對(duì)應(yīng)的值)
實(shí)例:
drop table if exists t;
create table t(sex enum('0','1'));
insert into t values(1);
insert into t values('3');
select * from t;
+------+
| sex |
+------+
| 0 |
| |
+------+
2 rows in set (0.00 sec)
1-11.盡可能不使?TEXT、BLOB類型。
a) 索引排序問(wèn)題,只能使?max_sort_length的長(zhǎng)度或者??指定ORDER BY SUBSTRING(column,length)的長(zhǎng)度來(lái)排序
b) Memory引擘不?持text,blog類型,會(huì)在磁盤上?成臨時(shí)表
c) 可能浪費(fèi)更多的空間
d) 可能?法使?adaptive hash index
e) 導(dǎo)致使?where沒(méi)有索引的語(yǔ)句變慢
1-13. VARCHAR中會(huì)產(chǎn)?額外存儲(chǔ)嗎?
VARCHAR(M),如果M256時(shí)會(huì)使??個(gè)字節(jié)來(lái)存儲(chǔ)長(zhǎng)度,如果M=256則使?兩個(gè)字節(jié)來(lái)存儲(chǔ)長(zhǎng)度。
1-14.表字符集選擇UTF8。
a) 使?utf8字符集,如果是漢字,占3個(gè)字節(jié),但ASCII碼字符還是1個(gè)字節(jié)。
b) 統(tǒng)?,不會(huì)有轉(zhuǎn)換產(chǎn)?亂碼風(fēng)險(xiǎn)
c) 其他地區(qū)的?戶(美國(guó)、印度、臺(tái)灣)?需安裝簡(jiǎn)體中??持,就能正??茨?字,并且不會(huì)出現(xiàn)亂碼
d)ISO-8859-1編碼(latin1)使?了單字節(jié)內(nèi)的所有空間,在?持ISO-8859-1的系統(tǒng)中傳輸和存儲(chǔ)其他任何編碼的字節(jié)流都不會(huì)被拋棄。即把其他任何編碼的字節(jié)流當(dāng)作ISO-8859-1編碼看待都沒(méi)有問(wèn)題,保存的是原封不動(dòng)的字節(jié)流。
1-15.使?VARBINARY存儲(chǔ)變長(zhǎng)字符串。
?進(jìn)制字節(jié)流,不存在編碼問(wèn)題
1-18. 為什么建議使?TIMESTAMP來(lái)存儲(chǔ)時(shí)間?不是DATETIME?
DATETIME和TIMESTAMP都是精確到秒,優(yōu)先選擇TIMESTAMP,因?yàn)門IMESTAMP只有4個(gè)字節(jié),?DATETIME8個(gè)字節(jié)。同時(shí)TIMESTAMP具有?動(dòng)賦值以及?動(dòng)更新的特性。
如何使?TIMESTAMP的?動(dòng)賦值屬性?
a) 將當(dāng)前時(shí)間作為ts的默認(rèn)值:ts TIMESTAMP DEFAULTCURRENT_TIMESTAMP。
b) 當(dāng)?更新時(shí),更新ts的值:ts TIMESTAMP DEFAULT 0 ONUPDATE CURRENT_TIMESTAMP。
c) 可以將1和2結(jié)合起來(lái):ts TIMESTAMP DEFAULTCURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP。
1-19.建議字段定義為NOT NULL。
a)如果null字段被索引,需要額外的1字節(jié)
b)使索引,索引統(tǒng)計(jì),值的?較變得更復(fù)雜
c)可?0,''代替
d)如果是索引字段,?定要定義為not null
1-21.禁?在數(shù)據(jù)庫(kù)中使?VARBINARY、BLOB存儲(chǔ)圖?、?件等。
采?分布式?件系統(tǒng)更?效
2. 為什么MySQL的性能依賴于索引?
MySQL的查詢速度依賴良好的索引設(shè)計(jì),因此索引對(duì)于?性能?關(guān)重要。合理的索引會(huì)加快查詢速度(包括UPDATE和DELETE的速
度,MySQL會(huì)將包含該?的page加載到內(nèi)存中,然后進(jìn)?UPDATE或者DELETE操作),不合理的索引會(huì)降低速度。
MySQL索引查找類似于新華字典的拼?和部?查找,當(dāng)拼?和部?索引不存在時(shí),只能通過(guò)?頁(yè)?頁(yè)的翻頁(yè)來(lái)查找。當(dāng)MySQL查詢不能使?索引時(shí),MySQL會(huì)進(jìn)?全表掃描,會(huì)消耗?量的IO。
2-5. 為什么?張表中不能存在過(guò)多的索引?
InnoDB的secondaryindex使?b+tree來(lái)存儲(chǔ),因此在UPDATE、DELETE、INSERT的時(shí)候需要對(duì)b+tree進(jìn)?調(diào)整,過(guò)多的索引會(huì)減慢更新的速度。
2-11. EXPLAIN語(yǔ)句
EXPLAIN語(yǔ)句(在MySQL客戶端中執(zhí)?)可以獲得MySQL如何執(zhí)?SELECT語(yǔ)句的信息。通過(guò)對(duì)SELECT語(yǔ)句執(zhí)?EXPLAIN,可以知曉MySQL執(zhí)?該SELECT語(yǔ)句時(shí)是否使?了索引、全表掃描、臨時(shí)表、排序等信息。盡量避免MySQL進(jìn)?全表掃描、使?臨時(shí)表、排序等。詳見(jiàn)官??檔。
2-13.不建議使?%前綴模糊查詢,例如LIKE “%weibo”。
會(huì)導(dǎo)致全表掃描
2-14. 如何對(duì)長(zhǎng)度?于50的VARCHAR字段建?索引?
下?的表增加?列url_crc32,然后對(duì)url_crc32建?索引,減少索引字段的長(zhǎng)度,提?效率。
CREATE TABLE url(
……
url VARCHAR(255) NOT NULL DEFAULT 0,
url_crc32INT UNSIGNED NOT NULL DEFAULT 0,
……
index idx_url(url_crc32)
);
2-16. 什么是覆蓋索引?
InnoDB 存儲(chǔ)引擎中,secondaryindex(?主鍵索引)中沒(méi)有直接存儲(chǔ)?地址,存儲(chǔ)主鍵值。如果?戶需要查詢secondaryindex中所不包含的數(shù)據(jù)列時(shí),需要先通過(guò)secondaryindex查找到主鍵值,然后再通過(guò)主鍵查詢到其他數(shù)據(jù)列,因此需要查詢兩次。
覆蓋索引的概念就是查詢可以通過(guò)在?個(gè)索引中完成,覆蓋索引效率會(huì)?較?,主鍵查詢是天然的覆蓋索引。
合理的創(chuàng)建索引以及合理的使?查詢語(yǔ)句,當(dāng)使?到覆蓋索引時(shí)可以獲得性能提升。
?如SELECT email,uid FROM user_email WHEREuid=xx,如果uid不是主鍵,適當(dāng)時(shí)候可以將索引添加為index(uid,email),以獲得性能提升。
3-3.UPDATE、DELETE語(yǔ)句不使?LIMIT。
a) 可能導(dǎo)致主從數(shù)據(jù)不?致
b) 會(huì)記錄到錯(cuò)誤?志,導(dǎo)致?志占??量空間
3-4. 為什么需要避免MySQL進(jìn)?隱式類型轉(zhuǎn)化?
因?yàn)镸ySQL進(jìn)?隱式類型轉(zhuǎn)化之后,可能會(huì)將索引字段類型轉(zhuǎn)化成=號(hào)右邊值的類型,導(dǎo)致使?不到索引,原因和避免在索引字段中使?函數(shù)是類似的。
3-6. 為什么不建議使?SELECT *?
增加很多不必要的消耗(cpu、io、內(nèi)存、?絡(luò)帶寬);增加了使?覆蓋索引的可能性;當(dāng)表結(jié)構(gòu)發(fā)?改變時(shí),前段也需要更新。
3-13. 如何減少與數(shù)據(jù)庫(kù)的交互次數(shù)?
使?下?的語(yǔ)句來(lái)減少和db的交互次數(shù):
INSERT ... ON DUPLICATE KEY UPDATE
REPLACE
INSERT IGNORE
INSERT INTO values(),()如何結(jié)合使?多個(gè)緯度進(jìn)?散表散庫(kù)?
例如微博message,先按照crc32(message_id)將message散到16個(gè)庫(kù)中,然后針對(duì)每個(gè)庫(kù)中的表,?天?成?張新表。
3-14. 為什么不能使?ORDER BY rand()?
因?yàn)镺RDER BYrand()會(huì)將數(shù)據(jù)從磁盤中讀取,進(jìn)?排序,會(huì)消耗?量的IO和CPU,可以在程序中獲取?個(gè)rand值,然后通過(guò)在從數(shù)據(jù)庫(kù)中獲取對(duì)應(yīng)的值。
3-15. MySQL中如何進(jìn)?分頁(yè)?
假如有類似下?分頁(yè)語(yǔ)句:
SELECT * FROM table ORDER BY TIME DESC LIMIT 10000,10;
這種分頁(yè)?式會(huì)導(dǎo)致?量的io,因?yàn)镸ySQL使?的是提前讀取策略。
推薦分頁(yè)?式:
SELECT * FROM table WHERE TIME
SELECT * FROM tableinner JOIN(SELECT id FROM table ORDER BY TIME LIMIT 10000,10) as t USING(id)
3-17.為什么避免使?復(fù)雜的SQL?
拒絕使?復(fù)雜的SQL,將?的SQL拆分成多條簡(jiǎn)單SQL分步執(zhí)?。原因:簡(jiǎn)單的SQL容易使?到MySQL的querycache;減少鎖表時(shí)間特別是MyISAM;可以使?多核cpu。
2. InnoDB存儲(chǔ)引擎為什么避免使?COUNT(*)?
InnoDB表避免使?COUNT(*)操作,計(jì)數(shù)統(tǒng)計(jì)實(shí)時(shí)要求較強(qiáng)可以使?memcache或者Redis,?實(shí)時(shí)統(tǒng)計(jì)可以使?單獨(dú)統(tǒng)計(jì)表,定時(shí)更新。
¥
5
百度文庫(kù)VIP限時(shí)優(yōu)惠現(xiàn)在開(kāi)通,立享6億+VIP內(nèi)容
立即獲取
mysql創(chuàng)建表字段長(zhǎng)度范圍_Mysql的建表規(guī)范與注意事項(xiàng)
mysql創(chuàng)建表字段長(zhǎng)度范圍_Mysql的建表規(guī)范與注意事項(xiàng)?、 表設(shè)計(jì)規(guī)范
庫(kù)名、表名、字段名必須使??寫字母,“_”分割。
庫(kù)名、表名、字段名必須不超過(guò)12個(gè)字符。
庫(kù)名、表名、字段名見(jiàn)名知意,建議使?名詞?不是動(dòng)詞。
建議使?InnoDB存儲(chǔ)引擎。
存儲(chǔ)精確浮點(diǎn)數(shù)必須使?DECIMAL替代FLOAT和DOUBLE。
建議使?UNSIGNED存儲(chǔ)?負(fù)數(shù)值。
建議使?INT UNSIGNED存儲(chǔ)IPV4。
第 1 頁(yè)
整形定義中不添加長(zhǎng)度,?如使?INT,?不是INT(4)。
使?短數(shù)據(jù)類型,?如取值范圍為0-80時(shí),使?TINYINT UNSIGNED。
不建議使?ENUM類型,使?TINYINT來(lái)代替。
盡可能不使?TEXT、BLOB類型。
VARCHAR(N),N表?的是字符數(shù)不是字節(jié)數(shù),?如VARCHAR(255),可以最?可存儲(chǔ)255個(gè)漢字,需要根據(jù)實(shí)際的寬度來(lái)選擇N。
VARCHAR(N),N盡可能?,因?yàn)镸ySQL?個(gè)表中所有的VARCHAR字段最?長(zhǎng)度是65535個(gè)字節(jié),進(jìn)?排序和創(chuàng)建臨時(shí)表?類的內(nèi)存操作時(shí),會(huì)使?N的長(zhǎng)度申請(qǐng)內(nèi)存。
第 2 頁(yè)
表字符集選擇UTF8。
使?VARBINARY存儲(chǔ)變長(zhǎng)字符串。
存儲(chǔ)年使?YEAR類型。
存儲(chǔ)?期使?DATE類型。
存儲(chǔ)時(shí)間(精確到秒)建議使?TIMESTAMP類型,因?yàn)門IMESTAMP使?4字節(jié),DATETIME使?8個(gè)字節(jié)。
建議字段定義為NOT NULL。
將過(guò)?字段拆分到其他表中。
禁?在數(shù)據(jù)庫(kù)中使?VARBINARY、BLOB存儲(chǔ)圖?、?件等。
表結(jié)構(gòu)變更需要通知DBA審核。
第 3 頁(yè)
?、 索引規(guī)范
?唯?索引必須按照“idx_字段名稱_字段名稱[_字段名]”進(jìn)?命名。
唯?索引必須按照“uniq_字段名稱_字段名稱[_字段名]”進(jìn)?命名。
索引名稱必須使??寫。
索引中的字段數(shù)建議不超過(guò)5個(gè)。
單張表的索引數(shù)量控制在5個(gè)以內(nèi)。
唯?鍵由3個(gè)以下字段組成,并且字段都是整形時(shí),使?唯?鍵作為主鍵。
沒(méi)有唯?鍵或者唯?鍵不符合5中的條件時(shí),使??增(或者通過(guò)發(fā)號(hào)器獲取)id作為主鍵。
第 4 頁(yè)
唯?鍵不和主鍵重復(fù)。
索引字段的順序需要考慮字段值去重之后的個(gè)數(shù),個(gè)數(shù)多的放在前?。
ORDER BY,GROUP BY,DISTINCT的字段需要添加在索引的后?。
使?EXPLAIN判斷SQL語(yǔ)句是否合理使?索引,盡量避免extra列出現(xiàn):Using File Sort,UsingTemporary。
UPDATE、DELETE語(yǔ)句需要根據(jù)WHERE條件添加索引。
不建議使?%前綴模糊查詢,例如LIKE “%weibo”。
對(duì)長(zhǎng)度過(guò)長(zhǎng)的VARCHAR字段建?索引時(shí),添加crc32或者M(jìn)D5 Hash字段,對(duì)Hash字段建?索引。
Linux 進(jìn)程通過(guò) C 標(biāo)準(zhǔn)庫(kù)中的內(nèi)存分配函數(shù) malloc 向系統(tǒng)申請(qǐng)內(nèi)存,但是到真正與內(nèi)核交互之間,其實(shí)還隔了一層,即內(nèi)存分配管理器(memory allocator)。常見(jiàn)的內(nèi)存分配器包括:ptmalloc(Glibc)、tcmalloc(Google)、jemalloc(FreeBSD)。MySQL 默認(rèn)使用的是 glibc 的 ptmalloc 作為內(nèi)存分配器。
內(nèi)存分配器采用的是內(nèi)存池的管理方式,處在用戶程序?qū)雍蛢?nèi)核層之間,它響應(yīng)用戶的分配請(qǐng)求,向操作系統(tǒng)申請(qǐng)內(nèi)存,然后將其返回給用戶程序。
為了保持高效的分配,分配器通常會(huì)預(yù)先向操作系統(tǒng)申請(qǐng)一塊內(nèi)存,當(dāng)用戶程序申請(qǐng)和釋放內(nèi)存的時(shí)候,分配器會(huì)將這些內(nèi)存管理起來(lái),并通過(guò)一些算法策略來(lái)判斷是否將其返回給操作系統(tǒng)。這樣做的最大好處就是可以避免用戶程序頻繁的調(diào)用系統(tǒng)來(lái)進(jìn)行內(nèi)存分配,使用戶程序在內(nèi)存使用上更加高效快捷。
關(guān)于 ptmalloc 的內(nèi)存分配原理,個(gè)人也不是非常了解,這里就不班門弄斧了,有興趣的同學(xué)可以去看下華庭的《glibc 內(nèi)存管理 ptmalloc 源代碼分析》【文末鏈接】。
關(guān)于如何選擇這三種內(nèi)存分配器,網(wǎng)上資料大多都是推薦摒棄 glibc 原生的 ptmalloc,而改用 jemalloc 或者 tcmalloc 作為默認(rèn)分配器。因?yàn)?ptmalloc 的主要問(wèn)題其實(shí)是內(nèi)存浪費(fèi)、內(nèi)存碎片、以及加鎖導(dǎo)致的性能問(wèn)題,而 jemalloc 與 tcmalloc 對(duì)于內(nèi)存碎片、多線程處理優(yōu)化的更好。
目前 jemalloc 應(yīng)用于 Firefox、FaceBook 等,并且是 MariaDB、Redis、Tengine 默認(rèn)推薦的內(nèi)存分配器,而 tcmalloc 則應(yīng)用于 WebKit、Chrome 等。
文章標(biāo)題:mysql表太長(zhǎng)要怎么調(diào) mysql建表長(zhǎng)度限制
文章分享:http://jinyejixie.com/article48/doseiep.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供、網(wǎng)站設(shè)計(jì)公司、網(wǎng)站設(shè)計(jì)、App設(shè)計(jì)、網(wǎng)站改版、品牌網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)