一瓶摆、編碼方式
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ǔ)路徑
配置錯(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索引原理:
將數(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ò);
第一個(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是對字段冗余性的約束尖淘,即任何字段不能由其他字段派生出來,它要求字段沒有冗余著觉。