MySQL

一瓶摆、編碼方式

1凉逛、gbk編碼:是國家標(biāo)準(zhǔn)編碼方式, 不論英文和中文都是由雙字節(jié)來表示群井,中文最高位為 1状飞,通用性比較差。
2书斜、utf8編碼:國際編碼诬辈,是多字節(jié)編碼(中文24,英文8)荐吉,可以包括世界上所有國家用
到的字符焙糟,通用性較好。

二样屠、MySQL日志

  • 1穿撮、錯(cuò)誤日志(-log-err):不僅用于存儲(chǔ)Mysql運(yùn)行時(shí)所產(chǎn)生的較為嚴(yán)重的警告或錯(cuò)誤信息。還記錄了:
    • 服務(wù)器啟動(dòng)和關(guān)閉過程中的信息;
    • 服務(wù)器運(yùn)行過程中的錯(cuò)誤信息;
    • 事件調(diào)度器運(yùn)行一個(gè)事件產(chǎn)生的信息;

查詢錯(cuò)誤日志存儲(chǔ)路徑

image.png

配置錯(cuò)誤日志文件

log-error="error.log"
  • 2痪欲、查詢?nèi)罩荆╩y.cnf):記錄建立的客戶端連接和執(zhí)行的所有語句(包括錯(cuò)誤的);
    查詢是否啟動(dòng)查詢?nèi)罩炯按鎯?chǔ)路徑
    image.png

    配置查詢?nèi)罩?/strong>
//日志輸出類型
log-output=FILE
general-log=1
general_log_file="filename.log"
  • 3悦穿、慢查詢?nèi)罩荆?log-slow-queries):(配置文件 my.ini)
    查詢路徑
    image.png

    配置
log-output=NONE
log_slow_queries=0
slow_query_log_file="filename.log"
//用來記錄MySQL中響應(yīng)時(shí)間超過閥值(臨界值)的語句
long_query_time=10

執(zhí)行select sleep(3) SQL語句存入慢查詢?nèi)罩镜恼Z句。

  • 4业踢、更新日志(-log-update)
  • 5栗柒、二進(jìn)制日志(-log-bin):熱備 主從復(fù)制
    查詢路徑
    image.png

三種格式:
Statement 記錄每一次修改數(shù)據(jù)庫數(shù)據(jù)時(shí)的sql語句。不用記錄修改的內(nèi)容
Row不記錄sql上下文相關(guān)信息知举,僅保存被修改的記錄瞬沦。詳細(xì)的記錄了被修改的信息。
Mixedlevel以上兩種的混合雇锡。
熱備(主從復(fù)制):Master服務(wù)器將自己的每一次改動(dòng)信息存入到Binarylog日志中蛙埂,從服務(wù)器Slave用master帳號登錄,并讀取主服務(wù)器內(nèi)的Binarylog文件遮糖,在從服務(wù)器上運(yùn)行該日志绣的,將數(shù)據(jù)進(jìn)行更新轉(zhuǎn)移。(包括三個(gè)進(jìn)程:1從服務(wù)器發(fā)出請求訪問Binarylog日志 2住服務(wù)器將日志內(nèi)容傳給從服務(wù)器 3從服務(wù)器運(yùn)行日志)

三欲账、分析慢查詢(explain)

在Mysql的配置文件中配置一個(gè)閾值屡江,所有sql語句執(zhí)行時(shí)間超過這個(gè)閾值的將被存儲(chǔ)到慢查詢?nèi)罩局校诮K端通過explain該條sql語句

mysql> explain select * from users where name = 'dd';
+----+-------------+-------+------+---------------+------------+---------+-------+------+-------------+
| id | select_type | table | type | possible_keys | key        | key_len | ref   | rows | Extra       |
+----+-------------+-------+------+---------------+------------+---------+-------+------+-------------+
|  1 | SIMPLE      | users | ref  | name_index    | name_index | 258     | const |    1 | Using where |
+----+-------------+-------+------+---------------+------------+---------+-------+------+-------------+
1 row in set (0.04 sec)
// 主要關(guān)注type赛不、key惩嘉、rows三個(gè)屬性
//type代表mysql找到所需行的方式,可以取值為:ALL(全表掃描)踢故、ref(哪些列或常量被用于查找索引列上的值)
// key代表實(shí)際使用的索引
// rows代表sql查詢讀取的行數(shù)

具體信息在這里這里文黎。

四 惹苗、索引

索引精講
分類:

  • 1.普通索引:index,普通的
  • 2.唯一索引:unique耸峭,不允許重復(fù)
  • 3.主鍵索引:primary桩蓉,唯一且不能為空
  • 4.全文索引:fulltext,用于一篇文章中檢索文本信息

創(chuàng)建索引的條件:

  • 1.經(jīng)常用作where條件或者join子句中常出現(xiàn)的列劳闹;
  • 2.索引列值的分布院究,基數(shù)越大索引效果越好;
  • 3.使用短索引本涕,如對字符串進(jìn)行索引业汰,制定一個(gè)前綴長度節(jié)省索引空間提升速率;
  • 4.不要過度索引菩颖,索引占用額外的磁盤空間样漆,索引過多也會(huì)降低寫操作性能;
  • 5.查詢條件中有or時(shí)晦闰,只有查詢條件都創(chuàng)建索引才能使用索引氛濒,有其中一個(gè)沒有建立索引,則這條sql不會(huì)使用索引鹅髓;
  • 6.最左匹配原則:
    假如有個(gè)聯(lián)合索引 key (col1,col2)舞竿。那么以下查詢是索引無效的
select * from test where col2 = 3;
select * from test where col1 like '%3';
  • 7.索引列不能是表達(dá)式或函數(shù)的一部分,否則索引無效窿冯;

注意:

  • 1骗奖、不同的存儲(chǔ)引擎支持不同形式的索引,同一種索引在不同的存儲(chǔ)引擎下也會(huì)有不同的實(shí)現(xiàn)方式;例如MyISAM和InnoDB兩種就不支持哈希索引,兩者都支持B+Tree索引,但實(shí)現(xiàn)方式有所區(qū)別;
  • 2、查看索引使用情況
show status like 'Handler_read%';
// Handler_read_key 值越高表示索引使用率越高
// Handler_read_rnd_next 值越高索引使用率越低

為減少IO操作,每一次IO讀取數(shù)據(jù)時(shí)都會(huì)將其相鄰的數(shù)據(jù)讀取到內(nèi)存的緩沖區(qū),因?yàn)榫植款A(yù)讀性原理告訴我們醒串,當(dāng)計(jì)算機(jī)訪問一個(gè)地址的數(shù)據(jù)的時(shí)候执桌,與其相鄰的數(shù)據(jù)也會(huì)很快被訪問到;
B+Tree索引原理:

image.png

將數(shù)據(jù)分散存儲(chǔ)在不同的磁盤塊中,葉子節(jié)點(diǎn)用于存儲(chǔ)數(shù)據(jù),非葉子節(jié)點(diǎn)用于存儲(chǔ)搜索方向;

五、視圖:是一張?zhí)摂M表芜赌,select語句執(zhí)行的結(jié)果集

視圖的優(yōu)點(diǎn):

  • 1仰挣、使用視圖,可以定制用戶數(shù)據(jù)缠沈,聚焦特定的數(shù)據(jù)膘壶。
    解釋:在實(shí)際過程中,公司有不同角色的工作人員洲愤,我們以銷售公司為例的話颓芭, 采購人員,可以需要一些與其有關(guān)的數(shù)據(jù)柬赐,而與他無關(guān)的數(shù)據(jù)亡问,對他沒 有任何意義,我們可以根據(jù)這一實(shí)際情況肛宋,專門為采購人員創(chuàng)建一個(gè)視 圖州藕,以后他在查詢數(shù)據(jù)時(shí)束世,只需select * from view_caigou 就可以啦。
  • 2床玻、使用視圖毁涉,可以簡化數(shù)據(jù)操作。
    解釋:我們在使用查詢時(shí)笨枯,在很多時(shí)候我們要使用聚合函數(shù)薪丁,同時(shí)還要
    顯示其它字段的信息遇西,可能還會(huì)需要關(guān)聯(lián)到其它表馅精,這時(shí)寫的語句可能
    會(huì)很長,如果這個(gè)動(dòng)作頻繁發(fā)生的話粱檀,我們可以創(chuàng)建視圖洲敢,這以后,我
    們只需要select * from view1就可以啦茄蚯,這樣很方便压彭。
  • 3、使用視圖渗常,基表中的數(shù)據(jù)就有了一定的安全性
    因?yàn)橐晥D是虛擬的壮不,物理上是不存在的,只是存儲(chǔ)了數(shù)據(jù)的集合皱碘,我們可以將基表中重要的字段信息询一,可以不通過視圖給用戶,視圖是動(dòng)態(tài)的數(shù)據(jù)的集合癌椿,數(shù)據(jù)是隨著基表的更新而更新健蕊。同時(shí),用戶對視圖踢俄,不可以隨意的更改和刪除缩功,可以保證數(shù)據(jù)的安全性。
  • 4都办、可以合并分離的數(shù)據(jù)嫡锌,創(chuàng)建分區(qū)視圖
    隨著社會(huì)的發(fā)展,公司的業(yè)務(wù)量的不斷的擴(kuò)大琳钉,一個(gè)大公司世舰,下屬都設(shè)有很多的分公司,為了管理方便槽卫,我們需要統(tǒng)一表的結(jié)構(gòu)跟压,定期查看各公司業(yè)務(wù)情況,而分別看各個(gè)公司的數(shù)據(jù)很不方便歼培,沒有很好的可比性震蒋,如果將這些數(shù)據(jù)合并為一個(gè)表格里茸塞,就方便多啦,這時(shí)我們就可以使用union關(guān)鍵字,將各分公司的數(shù)據(jù)合并為一個(gè)視圖查剖。

六.數(shù)據(jù)一致性(處理高并發(fā))

修改下表中的username,打開兩個(gè)終端窗口,第一個(gè)輸入

//手動(dòng)提交事務(wù) 為1時(shí)自動(dòng)提交
set autocommit=0; 
begin work; 
select * from users where id=1 for update;

在另一個(gè)窗口輸入

update users set username=123 where id=1;

此時(shí)第一個(gè)窗口正在更新該條數(shù)據(jù),并為其家鎖,因此第二個(gè)窗口無法都數(shù)據(jù)進(jìn)行更改,數(shù)據(jù)庫報(bào)錯(cuò);


image.png

第一個(gè)窗口提交事務(wù)后,其余進(jìn)程才可以修改數(shù)據(jù)

update users set username=23 where id=1;commit work;

七.函數(shù)钾虐、存儲(chǔ)過程、存儲(chǔ)引擎

信息函數(shù):
顯示要查詢內(nèi)容的信息(數(shù)據(jù)庫版本 數(shù)據(jù)的編碼方式等)
自定義函數(shù)(UDF):必要條件(參數(shù) 返回值)
創(chuàng)建自定義函數(shù):
create function 函數(shù)名稱(參數(shù)列表)
returns 返回值類型
函數(shù)體(sql語句)
create function f_name
returns{string|interger|real|decimal}
函數(shù)體

  • 存儲(chǔ)過程:
    SQL語句和控制語句的預(yù)編譯集合笋庄,以一個(gè)名稱存儲(chǔ)作為一個(gè)單元處理效扫。
  • 存儲(chǔ)過程的優(yōu)點(diǎn):
       1.存儲(chǔ)過程只在創(chuàng)造時(shí)進(jìn)行編譯,以后每次執(zhí)行存儲(chǔ)過程都不需再重新編譯直砂,而一般SQL語句每執(zhí)行一次就編譯一次,所以使用存儲(chǔ)過程可提高數(shù)據(jù)庫執(zhí)行速度菌仁。
      2.當(dāng)對數(shù)據(jù)庫進(jìn)行復(fù)雜操作時(shí)(如對多個(gè)表進(jìn)行Update,Insert,Query,Delete時(shí)),可將此復(fù)雜操作用存儲(chǔ)過程封裝起來與數(shù)據(jù)庫提供的事務(wù)處理結(jié)合一起使用静暂。
      3.存儲(chǔ)過程可以重復(fù)使用,可減少數(shù)據(jù)庫開發(fā)人員的工作量
      4.安全性高,可設(shè)定只有某此用戶才具有對指定存儲(chǔ)過程的使用權(quán)
  • 創(chuàng)建存儲(chǔ)過程:
    create procedure sp1(參數(shù))
    select version();
    調(diào)用存儲(chǔ)過程:
    call sp1[()];
    IN:表示該參數(shù)的值必須在調(diào)用存儲(chǔ)過程時(shí)指定济丘,不可以返回
    OUT:表示該參數(shù)的值可以被存儲(chǔ)過程改變,并且可以返回
    INOUT:表示該參數(shù)的值在調(diào)用時(shí)指定洽蛀,并且可以被改變和返回
    存儲(chǔ)過程與函數(shù)的區(qū)別:
    函數(shù)只能通過return語句返回單個(gè)值或者表對象摹迷。而存儲(chǔ)過程不允許執(zhí)行return,但是可以通過out參數(shù)返回多個(gè)值郊供,并且定義時(shí)的情況也有不同峡碉,存儲(chǔ)過程的參數(shù)需要判斷為輸入?yún)?shù)還是輸出參數(shù),對應(yīng)IN和OUT驮审,在參數(shù)前面注明鲫寄。函數(shù)定義時(shí)使用FUNCTION,存儲(chǔ)過程定義使用PROCEDURE头岔。存儲(chǔ)過程的效率高于函數(shù)的效率塔拳。
    距離創(chuàng)建一個(gè)存儲(chǔ)過程,根據(jù)age刪除記錄峡竣,并輸出刪除內(nèi)容和刪除后的內(nèi)容
  • 存儲(chǔ)過程與自定義函數(shù)的區(qū)別:
    1靠抑、存儲(chǔ)過程實(shí)現(xiàn)的功能相對復(fù)雜,函數(shù)針對性較強(qiáng)
    2适掰、存儲(chǔ)過程可以返回多個(gè)值颂碧,函數(shù)只能有一個(gè)返回值
    3、存儲(chǔ)過程一般獨(dú)立執(zhí)行类浪,函數(shù)可以作為 sql 語句的組成部分來出現(xiàn)
create procedure sp1(in p_age smallint unsigned,out deleteUser smallint unsigned,out userCount smallint unsigned)
begin
delete from users where age=p_age;(刪除年齡為p_age的用戶名)
select row_count into deleteUser;(將刪除的用戶存入deleteUser表;row_count函數(shù)返回前一個(gè)被sql更新载城,刪除,插入的行)
select count(id) from users into userCount;(將刪除后的信息存入userCount表)
end
call sp1(20,@a,@b);

begin—end語句中間聲明的局部變量之在begin—end之間有效费就。
set @num:set或者select 后跟的@num叫做用戶變量诉瓦。
存儲(chǔ)引擎:
根據(jù)每張表經(jīng)常的不同操作,而選擇不同的存儲(chǔ)引擎。一種存儲(chǔ)數(shù)據(jù)睬澡,查詢數(shù)據(jù)的技術(shù)固额。

  • 1 MyISAM:管理非事務(wù)表。它提供高速存儲(chǔ)和檢索煞聪,以及全文搜索能力斗躏。MyISAM在所有MySQL配置里被支持,它是默認(rèn)的存儲(chǔ)引擎昔脯,除非你配置MySQL默認(rèn)使用另外一個(gè)引擎啄糙。

  • 2 InnoDB:用于事務(wù)處理應(yīng)用程序,具有眾多特性云稚,包括ACID事務(wù)支持隧饼。

  • 3 Memory:將所有數(shù)據(jù)保存在RAM中,在需要快速查找引用和其他類似數(shù)據(jù)的環(huán)境下碱鳞,可提供極快的訪問桑李。

  • 4 CSV:存儲(chǔ)引擎把數(shù)據(jù)以逗號分隔的格式存儲(chǔ)在文本文件中踱蛀。

  • 5 Archive:為大量很少引用的歷史窿给、歸檔、或安全審計(jì)信息的存儲(chǔ)和檢索提供了完美的解決方案率拒。

  • 并發(fā)控制:當(dāng)多個(gè)連接對數(shù)據(jù)進(jìn)行修改時(shí)保證記錄的一致性和完整性崩泡。

  • 共享鎖(讀鎖):在多個(gè)用戶同時(shí)讀取一條數(shù)據(jù)時(shí),數(shù)據(jù)不會(huì)發(fā)生改變猬膨。

  • 排他鎖(寫鎖):在任何情況下只能有一個(gè)用戶進(jìn)行寫操作角撞,此時(shí)阻止其他用戶進(jìn)行讀操作或者寫操作。

八勃痴、范式

第一范式:1NF是對屬性的原子性約束谒所,要求屬性具有原子性,不可再分解沛申;
第二范式:2NF是對記錄的惟一性約束劣领,要求記錄有惟一標(biāo)識,即實(shí)體的惟一性铁材;
第三范式:3NF是對字段冗余性的約束尖淘,即任何字段不能由其他字段派生出來,它要求字段沒有冗余著觉。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末村生,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子饼丘,更是在濱河造成了極大的恐慌趁桃,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異卫病,居然都是意外死亡屡穗,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門忽肛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來村砂,“玉大人,你說我怎么就攤上這事屹逛〈》希” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵罕模,是天一觀的道長评腺。 經(jīng)常有香客問我,道長淑掌,這世上最難降的妖魔是什么蒿讥? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮抛腕,結(jié)果婚禮上芋绸,老公的妹妹穿的比我還像新娘。我一直安慰自己担敌,他們只是感情好摔敛,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著全封,像睡著了一般马昙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上刹悴,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天行楞,我揣著相機(jī)與錄音,去河邊找鬼土匀。 笑死子房,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的恒削。 我是一名探鬼主播池颈,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼钓丰!你這毒婦竟也來了躯砰?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤携丁,失蹤者是張志新(化名)和其女友劉穎琢歇,沒想到半個(gè)月后兰怠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡李茫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年揭保,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片魄宏。...
    茶點(diǎn)故事閱讀 40,503評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡秸侣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出宠互,到底是詐尸還是另有隱情味榛,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布予跌,位于F島的核電站搏色,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏券册。R本人自食惡果不足惜频轿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望烁焙。 院中可真熱鬧航邢,春花似錦、人聲如沸考阱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽乞榨。三九已至,卻和暖如春当娱,著一層夾襖步出監(jiān)牢的瞬間吃既,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工跨细, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鹦倚,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓冀惭,卻偏偏與公主長得像震叙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子散休,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容