一、常用指令
- SHOW DATABASES;
- SHOW CREATE DATABASE database_name;
- DROP DATABASE database_name;
- USE database_name;
- CREATE DATABASE database_name;
- SHOW VARIABLES LIKE 'storage_engine'; '%char%'
- DESCRIBE(DESC) database_name;
- ALTER TABLE <舊表名> RENAME [TO] <新表名>;
- ALTER TABLE <表名> MODIFY <字段名> <數(shù)據(jù)類型>;
- ALTER TABLE <表名> CHANGE <舊字段名> <新字段名> <新數(shù)據(jù)類型>;
- ... ...
二削罩、數(shù)據(jù)類型
- 整數(shù)類型
TINYINT(1字節(jié))瞄勾、SMALLINT(2字節(jié))费奸、MEDIUMINT(3字節(jié))、INT/INTEGER(4字節(jié))进陡、BIGINT(5字節(jié)) - 浮點(diǎn)數(shù)和定點(diǎn)數(shù)類型
MySQL中使用浮點(diǎn)數(shù)和定點(diǎn)數(shù)來表示小數(shù)愿阐,浮點(diǎn)類型有兩種:?jiǎn)尉雀↑c(diǎn)類型(FLOAT)和雙精度浮點(diǎn)類型(DOUBLE)。定點(diǎn)類型只有一種:DECIMAL趾疚。浮點(diǎn)類型和定點(diǎn)類型都可以用(M,N)來表示缨历,其中M稱為精度,表是總共的位數(shù)糙麦,N稱為標(biāo)度戈二,表示小數(shù)的位數(shù)。
FLOAT(4字節(jié))喳资、DOUBLE(8字節(jié))觉吭、DECIMAL(M+2個(gè)字節(jié))
注:在MySQL中,定點(diǎn)數(shù)以字符串形式存儲(chǔ)仆邓,在對(duì)精度要求比較高的時(shí)候(比如貨幣鲜滩、科學(xué)數(shù)據(jù)等)使用DECIMAL的類型比較好,另外节值,兩個(gè)浮點(diǎn)數(shù)進(jìn)行減法和比較運(yùn)算時(shí)也容易出問題徙硅,所以在使用浮點(diǎn)類型時(shí)需要注意,并盡量避免做浮點(diǎn)數(shù)比較搞疗。 - 日期與時(shí)間類型
YEAR(1字節(jié))嗓蘑、TIME(3字節(jié))、DATE(3字節(jié))匿乃、DATETIME(8字節(jié))桩皿、TIMESTAMP(4字節(jié)) - 文本字符串類型
名稱 | 描述 | 存儲(chǔ)空間 |
---|---|---|
CHAR(M) | 定長非二進(jìn)制字符串 | M字節(jié),1<= M <=255 |
VARCHAR(M) | 變長非二進(jìn)制字符串 | L+1字節(jié)幢炸,其中L<= M泄隔,1<= M <=255 |
TINYTEXT | 非常小的非二進(jìn)制字符串 | L+1字節(jié),L<2^8 |
TEXT | 小的非二進(jìn)制字符串 | L+1字節(jié)宛徊,L<2^8 |
MEDIUMTEXT | 中等大小的非二進(jìn)制字符串 | L+3字節(jié)佛嬉,L<2^24 |
LONGTEXT | 大的非二進(jìn)制字符串 | L+4字節(jié),L<2^32 |
ENUM | 枚舉類型闸天,只能有一個(gè)枚舉字符串值 | 1或2字節(jié)暖呕,取決于枚舉值的數(shù)目,最大65535 |
SET | 一個(gè)設(shè)置苞氮,字符串對(duì)象可以有0或多個(gè)SET成員 | 1湾揽,2,4或8字節(jié),取決于成員數(shù)量钝腺,最多64 |
- 二進(jìn)制字符串類型
BIT抛姑、BINARY(M)赞厕、VARBINARY(M)艳狐、TINYBLOB(M)、BLOB(M)皿桑、MEDIUMBLOB(M)毫目、LONGBLOB(M)
三、索引
- 索引的分類
1.1 普通索引和唯一索引
普通索引是MySQL中基本索引類型诲侮,允許在定義索引的列中插入重復(fù)值和空值镀虐。
唯一索引要求索引列的值必須唯一,但允許有空值沟绪。主鍵索引是一種特殊的唯一索引刮便,不允許空值。
1.2 單列索引和組合索引
單列索引即一個(gè)索引只包含單個(gè)列绽慈,一個(gè)表可以有多個(gè)單列索引恨旱。
組合索引指的是在表的多個(gè)字段組合上創(chuàng)建的索引,只有在查詢條件中使用了這些字段的左邊字段時(shí)坝疼,索引才會(huì)被使用搜贤。使用組合索引時(shí)遵循最左前綴集合。
1.3 全文索引
全文索引類型為FULLTEXT钝凶,在定義索引的列上支持值的全文查找仪芒,允許在這些索引列中插入重復(fù)值和空值。全文所以可以在CHAR耕陷、VARCHAR或者TEXT類型的列上創(chuàng)建掂名。MySQL中只有MyISAM存儲(chǔ)引擎支持全文索引。
1.4 空間索引
空間索引只能在村塾引擎為MyISAM的表中創(chuàng)建哟沫,不常用铆隘。 - 索引的設(shè)計(jì)原則
(1)索引數(shù)量不能太多,一個(gè)表中如果有大量的索引南用,不僅占用磁盤空間膀钠,而且會(huì)影響INSERT、DELETE裹虫、UPDATE等語句的性能肿嘲。
(2)避免對(duì)經(jīng)常更新的表進(jìn)行過多的索引,并且索引中的列盡可能少筑公。而對(duì)經(jīng)常用于查詢的字段應(yīng)該創(chuàng)建索引雳窟,但要避免添加不必要的字段。
(3)數(shù)據(jù)量小的表最好不要使用索引,由于數(shù)據(jù)較少封救,查詢花費(fèi)的時(shí)間可能比遍歷索引的時(shí)間還要短拇涤,索引可能不會(huì)產(chǎn)生優(yōu)化效果。
(4)在條件表達(dá)式中經(jīng)常用到的不同值較多的列上建立索引誉结,在不同值很少的列上不要建立索引鹅士,否則不但不會(huì)提高查詢效率,反而會(huì)嚴(yán)重降低數(shù)據(jù)更新效率惩坑。
(5)當(dāng)唯一性是某種數(shù)據(jù)本身的特征時(shí)掉盅,指定唯一索引,使用唯一索引需能確保定義的列的數(shù)據(jù)完整性以舒,以提高查詢速度趾痘。
(6)在頻繁進(jìn)行排序或分組的列上建立索引,如果待排序的列有多個(gè)蔓钟,可以建立組合索引永票。
四、性能優(yōu)化
- 查詢優(yōu)化
1.1 分析查詢語句
EXPLAIN [EXTENDED] SELECT select_option;
分析查詢結(jié)果:
名稱 | 描述 |
---|---|
id | SELECT識(shí)別符滥沫,是SELECT的查詢序列號(hào) |
select_type | select語句的類型侣集,有以下幾種取值: SIMPLE 簡(jiǎn)單查詢,不包括鏈接查詢和子查詢佣谐; PRIMARY 主查詢肚吏,或者最外層的查詢; UNION 鏈接查詢的第2個(gè)或后面的查詢語句狭魂; |
table | 查詢的表 |
type | 表的連接類型罚攀,按照最佳類型到最差類型列出: 1. system 僅有一行的系統(tǒng)表,const類型的特例雌澄; 2. const 數(shù)據(jù)表最多只有一個(gè)匹配行斋泄,用于常數(shù)值比較主鍵或唯一索引; 3. eq_ref 對(duì)于每個(gè)來自前面的表的行的組合镐牺,從該表中讀取一行炫掐。用于一個(gè)索引的所有部分都在查詢中使用并且索引是UNIQUE或PRIMARY KEY時(shí); 4. ref |
possible_keys | 指出MySQL能使用哪個(gè)索引在該表中查找行 |
key | 表示查詢實(shí)際使用到的索引 |
key_len | 表示MySQL選擇的索引字段按字節(jié)計(jì)算的長度睬涧,通過key_len可以確定MySQL將實(shí)際使用一個(gè)多列索引中的幾個(gè)字段 |
ref | 表示使用哪個(gè)列或常數(shù)與索引一起來查詢記錄 |
rows | 顯示MySQL在表中進(jìn)行查詢時(shí)必須檢查的行數(shù) |
extra | 表示MySQL在處理查詢時(shí)的詳細(xì)信息 |
1.2 引起索引失效的查詢
(1)使用LIKE關(guān)鍵字的查詢語句:在使用LIKE關(guān)鍵字查詢的語句中募胃,如果匹配字符串的第一個(gè)字符為"%",索引失效畦浓,只有"%"不在第一個(gè)位置痹束,索引才會(huì)起作用。
(2)使用多列索引的查詢語句:MySQL可以為多個(gè)字段建立索引讶请,一個(gè)索引可以包括16個(gè)字段祷嘶。對(duì)于多列索引,只有查詢條件中使用了這些字段中的第1個(gè)字段,索引才會(huì)被使用论巍。
(3)使用OR關(guān)鍵字的查詢語句:查詢語句的查詢條件中只有OR關(guān)鍵字烛谊,且OR前后的兩個(gè)條件中的列都是索引時(shí),查詢中才會(huì)使用索引嘉汰。
1.3 子查詢的優(yōu)化
子查詢是指SELECT語句的嵌套查詢丹禀,一個(gè)SELECT查詢的結(jié)果作為另一個(gè)SELECT語句的條件。子查詢可以一次性完成很多邏輯上需要很多步驟才能完成的SQL操作郑现。子查詢雖然可以使查詢語句很靈活湃崩,但執(zhí)行效率不高荧降。這是因?yàn)閳?zhí)行子查詢時(shí)接箫,MySQL需要為內(nèi)層查詢語句的查詢結(jié)果在內(nèi)存中建立一個(gè)臨時(shí)表,然后外層查詢語句從臨時(shí)表中查詢記錄朵诫。查詢完畢后辛友,再撤銷這個(gè)臨時(shí)表。因此速度會(huì)減慢剪返。
再M(fèi)ySQL中废累,可以使用連接(JOIN)查詢來代替子查詢,連接查詢不需要建立臨時(shí)表脱盲,其速度比子查詢要快邑滨,如果查詢中使用索引的話,性能會(huì)更好钱反。
- 數(shù)據(jù)庫結(jié)構(gòu)優(yōu)化
合理的數(shù)據(jù)庫結(jié)構(gòu)不僅可以使數(shù)據(jù)庫占用更小的磁盤空間掖看,而且能夠使查詢速度更快。數(shù)據(jù)庫結(jié)構(gòu)的設(shè)計(jì)面哥,需要考慮數(shù)據(jù)冗余哎壳、查詢和更新的速度、字段的數(shù)據(jù)類型是否合理等多方面的內(nèi)容尚卫。常用的規(guī)則有以下幾點(diǎn):
(1)將字段很多的表分解成多個(gè)表
(2)增加中間表:針對(duì)需要經(jīng)常聯(lián)合查詢的表
(3)增加冗余字段
(4)優(yōu)化插入記錄的速度:影響插入速度的主要使索引归榕、唯一性校驗(yàn)、一次插入記錄條數(shù)等吱涉。
對(duì)于InnoDB引擎的表刹泄,常見的優(yōu)化方法如下:
a. 禁用唯一性檢查:插入之前使用set unique_checks=0禁用,完成之后再設(shè)置為1開啟怎爵,MyISAM同樣適用特石;
b. 禁用外鍵檢查:set foreign_key_checks=0;
c. 禁止自動(dòng)提交:set autocommit=0;
(5)分析表、檢查表和優(yōu)化表 - MySQL服務(wù)器優(yōu)化
3.1 優(yōu)化服務(wù)器硬件
(1)配置較大的內(nèi)存疙咸,內(nèi)容的速度比磁盤I/O快得多县匠,可以通過增加系統(tǒng)的緩沖區(qū)容量,使數(shù)據(jù)在內(nèi)存停留的時(shí)間更長,減少磁盤I/O乞旦;
(2)配置高速磁盤系統(tǒng)贼穆,以減少讀盤的等待時(shí)間,提高響應(yīng)速度兰粉;
(3)合理分布磁盤I/O故痊,把磁盤I/O分散在多個(gè)設(shè)備,以減少資源競(jìng)爭(zhēng)玖姑,提高并行操作能力愕秫;
(4)配置多處理器,MySQL是多線程的數(shù)據(jù)庫焰络,多處理器可以同時(shí)執(zhí)行多個(gè)線程戴甩;
3.2 優(yōu)化MySQL參數(shù)
MySQL服務(wù)的配置參數(shù)都在my.cnf或者my.ini文件的[MySQLd]組中,常見參數(shù)如下:
(1)key_buffer_size:表示索引緩沖區(qū)大小闪彼,通常取決于內(nèi)存的大小甜孤。索引緩沖區(qū)被所有的線程共享,適當(dāng)增加索引緩沖區(qū)可以得到更好處理的索引(對(duì)所有讀和多重寫)畏腕,但如果太大缴川,導(dǎo)致操作系統(tǒng)頻繁換頁,反而會(huì)降低系統(tǒng)性能描馅。
(2)table_cache:表示同時(shí)打開的表的個(gè)數(shù)把夸,同時(shí)打開的表太多會(huì)影響系統(tǒng)性能。
(3)query_cache_size:表示查詢緩沖區(qū)的大小铭污,該參數(shù)需要和query_cache_type配合使用恋日。當(dāng)query_cache_type=0時(shí),所有的查詢都不使用查詢緩沖區(qū)况凉,但MySQL不會(huì)釋放所配置的查詢緩沖區(qū)谚鄙;當(dāng)query_cache_type=1時(shí),所有的查詢都將使用查詢緩沖區(qū)刁绒,除非再查詢語句中指定SQL_NO_CACHE闷营;當(dāng)query_cache_type=2時(shí),只有再查詢語句中使用SQL_CACHE關(guān)鍵字知市,查詢才會(huì)使用查詢緩沖區(qū)傻盟,使用查詢緩沖區(qū)可以提高查詢的速度,這種方式只適用于修改操作少且經(jīng)常執(zhí)行相同的查詢操作的情況嫂丙。
(4)sort_buffer_size:表示排序緩沖區(qū)的大小娘赴,值越大,進(jìn)行排序的速度就越快跟啤。
(5)read_buffer_size:表示每個(gè)線程連續(xù)掃描時(shí)為掃描的每個(gè)表分配的緩沖區(qū)大小诽表。
(6)innodb_buffer_pool_size:表示InnoDB類型的表和索引的最大緩存唉锌,值越大查詢速度就越快,但是太大會(huì)影響操作系統(tǒng)性能竿奏。
(7)max_connections:表示數(shù)據(jù)庫的最大連接數(shù)袄简,并不是越大越好,會(huì)浪費(fèi)內(nèi)存的資源泛啸,過多的連接會(huì)導(dǎo)致MySQL服務(wù)器僵死绿语。
(8)innodb_flush_log_at_trx_commit:表示何時(shí)將緩沖區(qū)的數(shù)據(jù)寫入日志,并且將日志文件寫入磁盤中候址。該參數(shù)時(shí)InnoDB引擎的重要參數(shù)吕粹。共有三個(gè)值:0,1岗仑,2匹耕。當(dāng)值為0時(shí)表示每隔1秒將數(shù)據(jù)寫入日志文件并將日志文件寫入磁盤;值為1時(shí)表示每次提交事務(wù)時(shí)將數(shù)據(jù)寫入日志文件并將日志文件寫入磁盤赔蒲;值為2時(shí)表示每次提交事務(wù)時(shí)將數(shù)據(jù)寫入日志文件泌神,每隔1秒將日志文件寫入磁盤良漱;默認(rèn)為1舞虱,安全性最高,但最耗時(shí)母市;如果設(shè)置為2矾兜,日志仍然每秒都寫入硬盤,所以出現(xiàn)故障也不會(huì)丟失超過1~2秒的更新患久。
(9)back_log:表示再M(fèi)ySQL暫時(shí)停止回答新請(qǐng)求之前的短時(shí)間內(nèi)椅寺,多少個(gè)請(qǐng)求可以被存在堆棧中。即表示對(duì)到來的TCP/IP連接的偵聽隊(duì)列的大小蒋失,只有期望在一個(gè)短時(shí)間內(nèi)有很多連接時(shí)返帕,才需要增加該參數(shù)的值
(10)thread_cache_size:表示可以復(fù)用的線程的數(shù)量,如果有很多新的線程篙挽,為了提高性能可以增大該值
(11)wait_timeout:表示服務(wù)器在關(guān)閉一個(gè)連接時(shí)等待行動(dòng)的秒數(shù)荆萤,默認(rèn)為28800。