常用函數(shù)
函數(shù)介紹
? 事先提供好的一些功能可以直接使用
? 函數(shù)可以用在SELECT語句及其子句
? 也可以用在UPDATE,DELETE語句當(dāng)中棘催。
函數(shù)分類
? 字符串函數(shù)
? 數(shù)值函數(shù)
? 日期和時間函數(shù)
? 流程函數(shù)
? 其它函數(shù)
字符串函數(shù)
? concat(s1,s2...sn)
? 將傳入的字符連接成一個字符串
? 任何字符串與null進(jìn)行連接結(jié)果都是null
? insert(str,x,y,instr)
? 將字符串str從x位置開始寸痢,y個字符長的子串替換為指定的字符
?
? LOWER(Str)和UPPER(str)
? 將字符串轉(zhuǎn)成小寫或大寫
? LEFT(str,x)和RIGHT(str,x)
? 分別返回字符串最左邊的x個字符和最右邊的x個字符
? 如果第二個參數(shù)為null,那么不返回任何字符
? LPAD(str,n,pad)和RPAD(str,n,pad)用字符串pad對str最左邊或最右邊進(jìn)行填充捷泞,直接到長度為n個字符長度
? LTRIM(str)和RTRIM(str)
? 去掉字符串當(dāng)中最左側(cè)和最右側(cè)的空格
? TRIM(str)
? 去掉字符串左右的空格
? REPEAT(str,x)
? 返回str重復(fù)x次的結(jié)果
? REPLACE(str,a,b)
? 用字符串b替換字符串str中所有出現(xiàn)的字符串a(chǎn).
? SUBSTRING(str,x,y)
? 返回字符串str中第x位置起y個字符長度的字符
數(shù)值函數(shù)
? ABS(x)
? 返回X的絕對值
? CEIL(x)
? 小數(shù)不為零部分上取整,即向上取最近的整數(shù)
? FLOOR(x)
? 小數(shù)部分下取整雏逾,即向下取最近的整數(shù)
? MOD(X,Y)
? 返回X/Y的模
? RAND()
? 返回0-1內(nèi)容的隨機(jī)值
日期和時間函數(shù)
? CURDATE()
? 返回當(dāng)前日期巢株,只包含年月日
? CURTIME()
? 返回當(dāng)前時間惠毁,只包含時分秒
? NOW()
? 返回當(dāng)前日期和時間犹芹,年月日時分秒都包含
? UNIX_TIMESTAMP
? 返回當(dāng)前日期的時間戳
? FROM_UNIXTIME(unixtime)
? 將一個時間戳轉(zhuǎn)換成日期
? WEEK(DATE)
? 返回當(dāng)前是一年中的第幾周
? YEAR(DATE)
? 返回所給日期是那一年
? HOUR(TIME)
? 返回當(dāng)前時間的小時
? MINUTE(TIME)
? 返回當(dāng)前時間的分鐘
? DATE_FORMAT(date,fmt)
? 按字符串格式化日期date值?
? DATE_ADD(date,interval expr type)
? 計算日期間隔
? DATEDIFF(date1,date2)
? 計算兩個日期相差的天數(shù)
流程函數(shù)
? IF(value,t,f)
? 如果value是真,返回t,否則返回f
?
? IFNULL(value1,value2)
? 如果value1不為空仁讨,返回value1否者返回value2
? CASE WHEN THEN END
?其他常用函數(shù)
? DATABASE()
? 返回當(dāng)前數(shù)據(jù)庫名
?
? VERSION()
? 返回當(dāng)前數(shù)據(jù)庫版本
? USER()
? 返回當(dāng)前登陸用戶名
? PASSWORD(STR)
? 對str進(jìn)行加密
? MD5()
? 返回str的MD5值
事務(wù)
什么是事務(wù)
? 不可分割的操作,假設(shè)該操作有ABCD四個步驟組成.
? 若ABCD四個步驟都成功完成,則認(rèn)為事務(wù)成功.
? 若ABCD中任意一個步驟操作失敗,則認(rèn)為事務(wù)失敗
? 每條sql語句都是一個事務(wù)
? 事務(wù)只對DML語句有效,對于DQL無效
事務(wù)的ACID
原子性(Atomicity)
? 原子性是指事務(wù)包含的所有操作要么全部成功羽莺,要么全部失敗回滾
一致性(Consistency)
? 一致性是指事務(wù)必須使數(shù)據(jù)庫從一個一致性狀態(tài)變換到另一個一致性狀態(tài),也就是說一個事務(wù)執(zhí)行之前和執(zhí)行之后都必須處于一致性狀態(tài)洞豁。
? 讓數(shù)據(jù)保持一定上的合理
? 一個商品出庫時盐固,倉庫商品數(shù)量減1荒给,對應(yīng)用戶的購物車中商品加1
隔離性(Isolation)
? 隔離性是當(dāng)多個用戶并發(fā)訪問數(shù)據(jù)庫時,比如操作同一張表時刁卜,數(shù)據(jù)庫為每一個用戶開啟的事務(wù)志电,不能被其他事務(wù)的操作所干擾,多個并發(fā)事務(wù)之間要相互隔離蛔趴。
持久性(Durability)
? 持久性是指一個事務(wù)一旦被提交了挑辆,就不能再回滾了,已經(jīng)把數(shù)據(jù)保存到數(shù)據(jù)庫當(dāng)中了孝情。
事務(wù)的使用
開啟事務(wù)
? start transaction
提交事務(wù)
? commit
? 所有語句全部執(zhí)行完畢鱼蝉,沒有發(fā)生異常,提交事務(wù),更新到數(shù)據(jù)庫當(dāng)中箫荡。
回滾事務(wù)
? rollback
? 當(dāng)遇到一突發(fā)情況魁亦,撤銷執(zhí)行的sql語句
執(zhí)行流程
?
事務(wù)的并發(fā)問題
臟讀
? 老板要給程序員發(fā)工資,程序員的工資是3.6萬/月羔挡。但是發(fā)工資時老板不小心按錯了數(shù)字洁奈,按成3.9萬/月,該錢已經(jīng)打到程序員的戶口绞灼,但是事務(wù)還沒有提交利术,就在這時,程序員去查看自己這個月的工資低矮,發(fā)現(xiàn)比往常多了3千元印叁,以為漲工資了非常高興。但是老板及時發(fā)現(xiàn)了不對军掂,馬上回滾差點(diǎn)就提交了的事務(wù)喉钢,將數(shù)字改成3.6萬再提交
? 實際程序員這個月的工資還是3.6萬,但是程序員看到的是3.9萬良姆。他看到的是老板還沒提交事務(wù)時的數(shù)據(jù)。這就是臟讀幔戏。
解決辦法
? Read committed玛追!讀提交,能解決臟讀問題
? 不可重復(fù)讀
? 程序員拿著工資卡(卡里當(dāng)然是只有3.6萬)闲延,當(dāng)他買單時(程序員事務(wù)開啟)痊剖,收費(fèi)系統(tǒng)事先檢測到他的卡里有3.6萬,就在這個時候@萘帷陆馁!程序員的妻子要把錢全部轉(zhuǎn)出充當(dāng)家用,并提交合愈。當(dāng)收費(fèi)系統(tǒng)準(zhǔn)備扣款時叮贩,再檢測卡里的金額击狮,發(fā)現(xiàn)已經(jīng)沒錢了。程序員就會很郁悶益老,明明卡里是有錢的…
? 一個事務(wù)范圍內(nèi)兩個相同的查詢卻返回了不同數(shù)據(jù)彪蓬,這就是不可重復(fù)讀
? 解決辦法
? Repeatable read
重復(fù)讀
? 程序員拿著工資卡(卡里還是有3.6萬),當(dāng)他買時(事務(wù)開啟捺萌,不允許其他事務(wù)的UPDATE修改操作)档冬,收費(fèi)系統(tǒng)事先檢測到他的卡里有3.6萬。這個時候他的妻子不能轉(zhuǎn)出金額了桃纯。接下來收費(fèi)系統(tǒng)就可以扣款了酷誓。
幻讀
? 程序員某一天去消費(fèi),花了2千元态坦,然后他的妻子去查看他今天的消費(fèi)記錄(盐数,妻子事務(wù)開啟),看到確實是花了2千元驮配,就在這個時候娘扩,程序員花了1萬買了一部電腦,即新增INSERT了一條消費(fèi)記錄壮锻,并提交琐旁。當(dāng)妻子打印程序員的消費(fèi)記錄清單時(妻子事務(wù)提交),發(fā)現(xiàn)花了1.2萬元猜绣,似乎出現(xiàn)了幻覺灰殴,這就是幻讀。
? 解決辦法
? Serializable
? 但是這種事務(wù)隔離級別效率低下掰邢,比較耗數(shù)據(jù)庫性能牺陶,一般不使用。
? 對應(yīng)關(guān)系
事務(wù)隔離級別 | 臟讀 | 不可重復(fù)讀 | 幻讀 |
---|---|---|---|
讀未提交(read-uncommitted) | 是 | 是 | 是 |
不可重復(fù)讀(read-committed) | 否 | 是 | 是 |
可重復(fù)讀(repeatable-read) | 否 | 否 | 是 |
串行化(serializable) | 否 | 否 | 否 |
事務(wù)隔離級別
? Read uncommitted
? 就是一個事務(wù)可以讀取另一個未提交事務(wù)的數(shù)據(jù)
? Read committed
? 一個事務(wù)要等另一個事務(wù)提交后才能讀取數(shù)據(jù)
? Repeatable read
? 就是在開始讀取數(shù)據(jù)(事務(wù)開啟)時辣之,不再允許修改操作
? Serializable
? 在該級別下掰伸,事務(wù)串行化順序執(zhí)行,可以避免臟讀怀估、不可重復(fù)讀與幻讀
查看隔離級別
? select @@global.tx_isolation,@@tx_isolation;
設(shè)置隔離級別
? 全局的
? set global transaction isolation level read committed;
? 當(dāng)前會話
? set session transaction isolation level read committed;
權(quán)限操作
什么是權(quán)限
? 限制一個用戶能夠做什么事情狮鸭,在MySQL中,可以設(shè)置全局權(quán)限多搀,指定數(shù)據(jù)庫權(quán)限歧蕉,指定表權(quán)限,指定字段權(quán)限
有哪些權(quán)限
? create
? 創(chuàng)建數(shù)據(jù)庫康铭、表或索引權(quán)限
? DROP
? 除數(shù)據(jù)庫或表權(quán)限
? ALTER
? ALTER更改表惯退,比如添加字段、索引等
? DELETE
? 刪除數(shù)據(jù)權(quán)限
? INDEX
? 索引權(quán)限
? INSERT
? 插入權(quán)限
? SELECT
? 查詢權(quán)限
? UPDATE
? 更新權(quán)限
? CREATE VIEW
? 創(chuàng)建視圖權(quán)限
? EXECUTE
? 執(zhí)行存儲過程權(quán)限
創(chuàng)建用戶
? create user '用戶名'@'localhost' identified by '密碼';
刪除用戶
? DROP USER 用戶名稱
分配權(quán)限
? GRANT 權(quán)限 (columns) ON 數(shù)據(jù)庫對象 TO 用戶 IDENTIFIED BY "密碼" WITH GRANT OPTION
? 創(chuàng)建對指定數(shù)據(jù)庫的所有權(quán)限
? grant ALL PRIVILEGES on 數(shù)據(jù)庫名.* TO gaowei@localhost IDENTIFIED BY '1234' WITH GRANT OPTION;
? flush privileges;
? 創(chuàng)建一個超級管理員mylk,密碼為1234从藤,擁有所有權(quán)限催跪,并能繼續(xù)授予權(quán)限锁蠕;
? grant ALL PRIVILEGES on . TO mylk@localhost IDENTIFIED BY '1234' WITH GRANT OPTION;
? flush privileges;
? 創(chuàng)建一個gxq用戶只能對stu表進(jìn)行CRUD操作
? grant insert,update,select,delete on my_test.stu TO privuser@localhost IDENTIFIED BY '1234' ;
? flush privileges;
查看權(quán)限
? show grants
? 查看指定用戶的權(quán)限
? show grants for root@localhost;
刪除權(quán)限
? REVOKE 權(quán)限 ON 數(shù)據(jù)庫對象 FROM 用戶;
視圖
什么是視圖
? 視圖是一個虛擬表叠荠,其內(nèi)容由查詢定義匿沛。
? 同真實的表一樣,視圖包含一系列帶有名稱的列和行數(shù)據(jù)榛鼎。
? 行和列數(shù)據(jù)來自定義視圖的查詢所引用的表逃呼,并且在引用視圖時動態(tài)生成。
? 簡單的來說視圖是由select結(jié)果組成的表者娱;
視圖的特性
? 視圖是對若干張基本表的引用抡笼,一張?zhí)摫恚樵冋Z句執(zhí)行的結(jié)果黄鳍,
? 不存儲具體的數(shù)據(jù)(基本表數(shù)據(jù)發(fā)生了改變推姻,視圖也會跟著改變);
? 可以跟基本表一樣框沟,進(jìn)行增刪改查操作(增刪改操作有條件限制)藏古;
視圖的作用
? 安全性
? 創(chuàng)建一個視圖,定義好該視圖所操作的數(shù)據(jù)忍燥。之后將用戶權(quán)限與視圖綁定
? 這樣的方式是使用到了一個特性:grant語句可以針對視圖進(jìn)行授予權(quán)限拧晕。
? 查詢性能提高
? 提高了數(shù)據(jù)的獨(dú)立性
創(chuàng)建視圖
CREATE [ALGORITHM]={UNDEFINED|MERGE|TEMPTABLE}]
VIEW 視圖名 [(屬性清單)]
AS SELECT 語句
[WITH [CASCADED|LOCAL] CHECK OPTION];
? ALGORITHM參數(shù)
? merge
? 處理方式替換式,可以進(jìn)行更新真實表中的數(shù)據(jù)梅垄;
? TEMPTABLE
? 具化式厂捞,由于數(shù)據(jù)存儲在臨時表中,所以不可以進(jìn)行更新操作队丝!
? UNDEFINED
? 沒有定義ALGORITHM參數(shù)
? mysql更傾向于選擇替換方式靡馁。是因為它更加有效。
? WITH CHECK OPTION
? 更新數(shù)據(jù)時不能插入或更新不符合視圖限制條件的記錄机久。
? LOCAL和CASCADED
? 為可選參數(shù)臭墨,決定了檢查測試的范圍,默認(rèn)值為CASCADED膘盖。
修改視圖
? CREATE OR REPLACE VIEW 視圖名 AS SELECT [...] FROM [...];
刪除視圖
? drop view 視圖名稱;
視圖機(jī)制
? 替換式
? 操作視圖時裙犹,視圖名直接被視圖定義給替換掉
? 具化式
? mysql先得到了視圖執(zhí)行的結(jié)果,該結(jié)果形成一個中間結(jié)果暫時存在內(nèi)存中衔憨。
? 外面的select語句就調(diào)用了這些中間結(jié)果(臨時表)
? 替換式與具化式區(qū)別
? 替換方式,將視圖公式替換后袄膏,當(dāng)成一個整體sql進(jìn)行處理了践图。
? 具體化方式,先處理視圖結(jié)果沉馆,后處理外面的查詢需求码党。
視圖不可更新部分
? 聚合函數(shù);
? DISTINCT 關(guān)鍵字;
? GROUP BY子句;
? HAVING 子句;
? UNION 運(yùn)算符;
? FROM 子句中包含多個表;
? SELECT 語句中引用了不可更新視圖;
? 只要視圖當(dāng)中的數(shù)據(jù)不是來自于基表德崭,就不能夠直接修改
存儲過程
什么是存儲過程
? 一組可編程的函數(shù),是為了完成特定功能的SQL語句集
? 經(jīng)編譯創(chuàng)建并保存在數(shù)據(jù)庫中揖盘,用戶可通過指定存儲過程的名字并給定參數(shù)(需要時)來調(diào)用執(zhí)行眉厨。
? 存儲過程就是具有名字的一段代碼,用來完成一個特定的功能兽狭。
? 創(chuàng)建的存儲過程保存在數(shù)據(jù)庫的數(shù)據(jù)字典中
為什么要用存儲過程
? 將重復(fù)性很高的一些操作憾股,封裝到一個存儲過程中,簡化了對這些SQL的調(diào)用
? 批量處理
? 統(tǒng)一接口箕慧,確保數(shù)據(jù)的安全
? 相對于oracle數(shù)據(jù)庫來說服球,MySQL的存儲過程相對功能較弱,使用較少颠焦。
存儲過程的創(chuàng)建和調(diào)用
? DELIMITER $$
? 它與存儲過程語法無關(guān)
? DELIMITER語句將標(biāo)準(zhǔn)分隔符 - 分號(;)更改為:$$
? 因為我們想將存儲過程作為整體傳遞給服務(wù)器
? 而不是讓mysql工具一次解釋每個語句
? 告訴mysql解釋器斩熊,該段命令是否已經(jīng)結(jié)束了,mysql是否可以執(zhí)行了伐庭。默認(rèn)情況下粉渠,delimiter是分號;。在命令行客戶端中圾另,如果有一行命令以分號結(jié)束霸株,那么回車后,mysql將會執(zhí)行該命令盯捌。但有時候淳衙,不希望MySQL這么做。在為可能輸入較多的語句饺著,且語句中包含有分號箫攀。使用delimiter $$
,這樣只有當(dāng)$$出現(xiàn)之后幼衰,mysql解釋器才會執(zhí)行這段語句靴跛。
創(chuàng)建存儲過程
CREATE PROCEDURE 名稱()
BEGIN
語句
END $$
調(diào)用存儲過程
call 名稱();
刪除存儲過程
? drop procedure 名稱
存儲過程變量
? 在存儲過程中聲明一個變量
? 使用DECLARE語句
? DECLARE 變量名 數(shù)據(jù)類型(大小) DEFAULT 默認(rèn)值;
? 可以聲明一個名為total_sale的變量,數(shù)據(jù)類型為INT渡嚣,默認(rèn)值為0
? DECLARE total_sale INT DEFAULT 0;
? 聲明共享相同數(shù)據(jù)類型的兩個或多個變量
? DECLARE x, y INT DEFAULT 0;
? 分配變量值
? 要為變量分配一個值梢睛,可以使用SET語句
? SET total_count = 10;
? 使用SELECT INTO語句將查詢的結(jié)果分配給一個變量
? SELECT COUNT(*) INTO total_products FROM products
? 變量的范圍
? 如果在存儲過程中聲明一個變量,那么當(dāng)達(dá)到存儲過程的END語句時识椰,它將超出范圍绝葡,因此在其它代碼塊中無法訪問
存儲過程參數(shù)
? 三種類型
? IN
? 表示調(diào)用者向過程傳入值(傳入值可以是字面量或變量)
? OUT
? 表示過程向調(diào)用者傳出值
?
? INOUT
? INOUT參數(shù)是IN和OUT參數(shù)的組合。
? 定義參數(shù)
? create produce name(模式,參數(shù)名稱 數(shù)據(jù)類型(大懈桂摹))
存儲過程語句
? IF語句
IF expression THEN
statements;
END IF;
IF expression THEN
statements;
ELSE
else-statements;
END IF;
? CASE語句
CASE case_expression
WHEN when_expression_1 THEN commands
WHEN when_expression_2 THEN commands
...
ELSE commands
END CASE;
? 循環(huán)
WHILE expression DO
statements
END WHILE
REPEAT
statements;
UNTIL expression
END REPEAT
查看存儲過程
? 查看所有存儲過程
? SHOW PROCEDURE STATUS;
? 查看指定數(shù)據(jù)庫中的存儲過程
? SHOW PROCEDURE STATUS WHERE db = 'My_test4';
? 查看指定存儲過程源代碼
? SHOW CREATE PROCEDURE 存儲過程名
自定義函數(shù)
自定義函數(shù)
delimiter $$
CREATE PROCEDURE insert_emp(in startNum int,in max_num int)
BEGIN
-- 自定義記錄是第幾條數(shù)據(jù)
DECLARE i int DEFAULT 0 ;
-- 默認(rèn)情況下是自動提交sql
set autocommit=0;
REPEAT
SET i= i+1;
-- 插入數(shù)據(jù)
INSERT into emp VALUES(startNum+i,rand_str(5),FLOOR(10+rand()*30));
UNTIL i = max_num
END REPEAT;
COMMIT;
end $$
-- 整體提交所有sql 提高效率
delimiter ;
隨即產(chǎn)一個部門編號
索引
什么是索引
? 索引用于快速找出在某個列中有一特定值的行藏畅,
? 不使用索引,MySQL必須從第一條記錄開始讀完整個表功咒,直到找出相關(guān)的行愉阎,
? 表越大绞蹦,查詢數(shù)據(jù)所花費(fèi)的時間就越多,
? 如果表中查詢的列有一個索引榜旦,MySQL能夠快速到達(dá)一個位置去搜索數(shù)據(jù)文件幽七,
? 而不必查看所有數(shù)據(jù),那么將會節(jié)省很大一部分時間
索引的優(yōu)勢與劣勢
? 優(yōu)勢
? 類似大學(xué)圖書館建書目索引溅呢,提高數(shù)據(jù)檢索效率澡屡,降低數(shù)據(jù)庫的IO成本。
? 通過索引對數(shù)據(jù)進(jìn)行排序藕届,降低數(shù)據(jù)排序的成本挪蹭,降低了CPU的消耗。
? 劣勢
? 實際上索引也是一張表休偶,該表保存了主鍵與索引字段梁厉,并指向?qū)嶓w表的記錄,所以索引列也是要占空間的踏兜。
? 雖然索引大大提高了查詢速度词顾,同時確會降低更新表的速度,如對表進(jìn)行INSERT碱妆、UPDATE肉盹、DELETE。
索引的分類
? 單值索引
? 即一個索引只包含單個列疹尾,一個表可以有多個單列索引上忍。
? 唯一索引
? 索引列的值必須唯一,但允許有空值纳本。
? 復(fù)合索引
? 一個索引包含多個列窍蓝。
? INDEX MultiIdx(id,name,age)
? 全文索引
? 只有在MyISAM引擎上才能使用,只能在CHAR,VARCHAR,TEXT類型字段上使用全文索引
索引操作
? 創(chuàng)建索引
? CREATE INDEX 索引名稱 ON table (column[, column]...);
? create INDEX salary_index ON emp(salary)
? 刪除索引
? DROP INDEX 索引名稱 ON 表名
? 查看索引
? show index from 表名;
? 索引當(dāng)中屬性
? Table
? 表名
? Non_unique
? 如果索引不能包括重復(fù)詞繁成,則為0吓笙。如果可以,則為1巾腕。
? Key_name
? 索引的名稱
? Seq_in_index
? 索引中的列序列號面睛,從1開始。
? Column_name
? 列名稱尊搬。
? Collation
? 列以什么方式存儲在索引中叁鉴。在MySQL中,有值‘A'(升序)或NULL(無分類)佛寿。
? Cardinality
? 索引中唯一值的數(shù)目的估計值幌墓。
? 過運(yùn)行ANALYZE TABLE或myisamchk -a可以更新。基數(shù)根據(jù)被存儲為整數(shù)的統(tǒng)計數(shù)據(jù)來計數(shù)克锣,所以即使對于小型表,該值也沒有必要是精確的腔长∠睿基數(shù)越大,當(dāng)進(jìn)行聯(lián)合時捞附,MySQL使用該索引的機(jī)會就越大巾乳。
? Sub_part
? 如果列只是被部分地編入索引,則為被編入索引的字符的數(shù)目鸟召。如果整列被編入索引胆绊,則為NULL。
? Packed
? 指示關(guān)鍵字如何被壓縮欧募。如果沒有被壓縮压状,則為NULL。
? Null
? 如果列含有NULL跟继,則含有YES种冬。如果沒有,則該列含有NO舔糖。
? Index_type
? 用過的索引方法(BTREE, FULLTEXT, HASH, RTREE)娱两。
? Comment
? 索引備注信息
? 自動創(chuàng)建索引
? 在表上定義了主鍵時, 會自動創(chuàng)建一個對應(yīng)的唯一索引
? 在表上定義了一個外鍵時金吗,會自動創(chuàng)建一個普通索引
EXPLAIN
explain select * from emp where id = 101;
? 用來查看索引是否正在被使用十兢,并且輸出其使用的索引的信息。
? id:
? SELECT識別符摇庙。這是SELECT的查詢序列號,也就是一條語句中旱物,該select是第幾次出現(xiàn)。在次語句中跟匆,select就只有一個异袄,所以是1.
? select_type:
? 所使用的SELECT查詢類型,SIMPLE表示為簡單的SELECT玛臂,不實用UNION或子查詢烤蜕,就為簡單的SELECT。
? table:
? 數(shù)據(jù)表的名字迹冤。他們按被讀取的先后順序排列
? type:
? 指定本數(shù)據(jù)表和其他數(shù)據(jù)表之間的關(guān)聯(lián)關(guān)系讽营,該表中所有符合檢索值的記錄都會被取出來和從上一個表中取出來的記錄作聯(lián)合。
? key:
? 實際選用的索引
? possible_keys:
? MySQL在搜索數(shù)據(jù)記錄時可以選用的各個索引泡徙,該表中就只有一個索引橱鹏,year_publication
? key_len:
? 顯示了mysql使用索引的長度(也就是使用的索引個數(shù)),當(dāng) key 字段的值為 null時,索引的長度就是 null莉兰。注意挑围,key_len的值可以告訴你在聯(lián)合索引中mysql會真正使用了哪些索引。這里就使用了1個索引糖荒,所以為1杉辙,
? ref:
? 給出關(guān)聯(lián)關(guān)系中另一個數(shù)據(jù)表中數(shù)據(jù)列的名字。常量(const)捶朵,這里使用的是1990蜘矢,就是常量。
? rows:
? MySQL在執(zhí)行這個查詢時預(yù)計會從這個數(shù)據(jù)表里讀出的數(shù)據(jù)行的個數(shù)综看。
? extra:
? 提供了與關(guān)聯(lián)操作有關(guān)的信息品腹,沒有則什么都不寫。
索引結(jié)構(gòu)
? 先會對數(shù)據(jù)進(jìn)行排序
? btree索引
? B+樹索引(二叉樹結(jié)構(gòu))
? B+樹是一個平衡的多叉樹红碑,從根節(jié)點(diǎn)到每個葉子節(jié)點(diǎn)的高度差值不超過1舞吭,而且同層級的節(jié)點(diǎn)間有指針相互鏈接。
? hash索引
? 哈希索引就是采用一定的哈希算法句喷,把鍵值換算成新的哈希值镣典,檢索時不需要類似B+樹那樣從根節(jié)點(diǎn)到葉子節(jié)點(diǎn)逐級查找,只需一次哈希算法即可立刻定位到相應(yīng)的位置唾琼,速度非承执海快。(只適用于MYISAM)
? hash 索引結(jié)構(gòu)的特殊性锡溯,其檢索效率非常高赶舆,索引的檢索可以一次定位,不像B-Tree 索引需要從根節(jié)點(diǎn)到枝節(jié)點(diǎn)祭饭,最后才能訪問到頁節(jié)點(diǎn)這樣多次的IO訪問芜茵,所以 Hash 索引的查詢效率要遠(yuǎn)高于 B-Tree 索引。
哪些情況需要創(chuàng)建索引
? 主鍵自動建立唯一索引
? 頻繁作為查詢條件的字段應(yīng)該創(chuàng)建索引
? 查詢中與其他表關(guān)聯(lián)的字段倡蝙,外鍵關(guān)系建立索引
? 頻繁更新的字段不適合建立索引九串,因為每次更新不單單是更新了記錄還會更新索引
? WHERE條件里用不到的字段不創(chuàng)建索引
? 查詢中排序的字段,排序的字段若通過索引去訪問將大大提高排序速度
? 查詢中統(tǒng)計或者分組字段
哪些情況不需要創(chuàng)建索引
? 表記錄太少
? 經(jīng)常增刪改的表
? 如果某個數(shù)據(jù)列包含許多重復(fù)的內(nèi)容寺鸥,為它建立索引就沒有太大的實際效果