MySQL基礎(chǔ)

一、常用指令

  1. SHOW DATABASES;
  2. SHOW CREATE DATABASE database_name;
  3. DROP DATABASE database_name;
  4. USE database_name;
  5. CREATE DATABASE database_name;
  6. SHOW VARIABLES LIKE 'storage_engine'; '%char%'
  7. DESCRIBE(DESC) database_name;
  8. ALTER TABLE <舊表名> RENAME [TO] <新表名>;
  9. ALTER TABLE <表名> MODIFY <字段名> <數(shù)據(jù)類型>;
  10. ALTER TABLE <表名> CHANGE <舊字段名> <新字段名> <新數(shù)據(jù)類型>;
  11. ... ...

二削罩、數(shù)據(jù)類型

  1. 整數(shù)類型
    TINYINT(1字節(jié))瞄勾、SMALLINT(2字節(jié))费奸、MEDIUMINT(3字節(jié))、INT/INTEGER(4字節(jié))进陡、BIGINT(5字節(jié))
  2. 浮點(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ù)比較搞疗。
  3. 日期與時(shí)間類型
    YEAR(1字節(jié))嗓蘑、TIME(3字節(jié))、DATE(3字節(jié))匿乃、DATETIME(8字節(jié))桩皿、TIMESTAMP(4字節(jié))
  4. 文本字符串類型
名稱 描述 存儲(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
  1. 二進(jìn)制字符串類型
    BIT抛姑、BINARY(M)赞厕、VARBINARY(M)艳狐、TINYBLOB(M)、BLOB(M)皿桑、MEDIUMBLOB(M)毫目、LONGBLOB(M)

三、索引

  1. 索引的分類
    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)建哟沫,不常用铆隘。
  2. 索引的設(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)化

  1. 查詢優(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ì)更好钱反。

  1. 數(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)化表
  2. 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。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末铣卡,一起剝皮案震驚了整個(gè)濱河市链韭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌煮落,老刑警劉巖敞峭,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蝉仇,居然都是意外死亡旋讹,警方通過查閱死者的電腦和手機(jī)殖蚕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來沉迹,“玉大人嫌褪,你說我怎么就攤上這事∨吖桑” “怎么了笼痛?”我有些...
    開封第一講書人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長琅拌。 經(jīng)常有香客問我缨伊,道長,這世上最難降的妖魔是什么进宝? 我笑而不...
    開封第一講書人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任刻坊,我火速辦了婚禮,結(jié)果婚禮上党晋,老公的妹妹穿的比我還像新娘谭胚。我一直安慰自己,他們只是感情好未玻,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開白布灾而。 她就那樣靜靜地躺著,像睡著了一般扳剿。 火紅的嫁衣襯著肌膚如雪旁趟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,775評(píng)論 1 307
  • 那天庇绽,我揣著相機(jī)與錄音锡搜,去河邊找鬼。 笑死瞧掺,一個(gè)胖子當(dāng)著我的面吹牛耕餐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播辟狈,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼肠缔,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了上陕?” 一聲冷哼從身側(cè)響起桩砰,我...
    開封第一講書人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎释簿,沒想到半個(gè)月后亚隅,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡庶溶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年煮纵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了懂鸵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡行疏,死狀恐怖匆光,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情酿联,我是刑警寧澤终息,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站贞让,受9級(jí)特大地震影響周崭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜喳张,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一续镇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧销部,春花似錦摸航、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽阿弃。三九已至淹冰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背歼指。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留甥雕,地道東北人踩身。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像社露,于是被迫代替她去往敵國和親挟阻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356