十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專(zhuān)業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
一般情況下,mysql會(huì)默認(rèn)提供多種存儲(chǔ)引擎,你可以通過(guò)下面的查看:\x0d\x0a\x0d\x0a看你的mysql現(xiàn)在已提供什么存儲(chǔ)引擎:\x0d\x0amysql show engines;\x0d\x0a\x0d\x0a看你的mysql當(dāng)前默認(rèn)的存儲(chǔ)引擎:\x0d\x0amysql show variables like '%storage_engine%';\x0d\x0a\x0d\x0a你要看某個(gè)表用了什么引擎(在顯示結(jié)果里參數(shù)engine后面的就表示該表當(dāng)前用的存儲(chǔ)引擎):\x0d\x0amysql show create table 表名;
10多年的江岸網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。成都全網(wǎng)營(yíng)銷(xiāo)的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整江岸建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)建站從事“江岸網(wǎng)站設(shè)計(jì)”,“江岸網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
方法一
如果你可以訪問(wèn)phpMyAdmin,你可以從phpMyAdmin找出默認(rèn)的數(shù)據(jù)庫(kù)類(lèi)型。從phpMyAdmin中選中數(shù)據(jù)庫(kù)來(lái)查看它的表列表。在“Type”一列的下面,你會(huì)看到每個(gè)表的數(shù)據(jù)表類(lèi)型。
方法二
如果你可以直接登錄MySQL服務(wù)器,另外一種鑒別存儲(chǔ)引擎的方法是登錄MySQL服務(wù)器后運(yùn)行下面的MySQL命令:
mysql SELECT ENGINE FROM information_schema.TABLES WHERE TABLE_SCHEMA ='my_database' AND TABLE_NAME ='my_table';
上面的命令會(huì)顯示在'mydatabase'數(shù)據(jù)庫(kù)中'mytable'表的引擎類(lèi)型。
方法三
還有一種檢查引擎的方法是使用mysqlshow,是一種命令行下的顯示數(shù)據(jù)庫(kù)信息的工具。mysqlshow在MySQL 客戶端安裝包中有。要使用mysqlshow,你需要提供MySQL服務(wù)器登錄憑據(jù)。
下面的命令會(huì)顯示特定的數(shù)據(jù)庫(kù)信息。在“Engine”一列下面,你可以看到每個(gè)表使用的引擎。
$ mysqlshow -u mysql_user-p -i database-name
2. 查看當(dāng)前MySQL 支持的存儲(chǔ)引擎
查看當(dāng)前MySQL支持的存儲(chǔ)引擎的命令可以使用:“SHOW VARIABLES”,在其后帶上“LIKE '%storage_engine%'”參數(shù):
SHOW VARIABLES LIKE '%storage_engine%';
其中,'%storage_engine%'是使用了通配字符的一個(gè)字符串,用來(lái)指代包含“storage_engine”的若干參數(shù)變量,如執(zhí)行后找到符合要求的,則在執(zhí)行結(jié)果中會(huì)有Variable_name參數(shù)表示存儲(chǔ)引擎的名字;Value參數(shù)表示系統(tǒng)是否支持該存儲(chǔ)引擎。
一般情況下,mysql會(huì)默認(rèn)提供多種存儲(chǔ)引擎,你可以通過(guò)下面的查看:
看你的mysql現(xiàn)在已提供什么存儲(chǔ)引擎:
mysql show engines;
看你的mysql當(dāng)前默認(rèn)的存儲(chǔ)引擎:
mysql show variables like '%storage_engine%';
你要看某個(gè)表用了什么引擎(在顯示結(jié)果里參數(shù)engine后面的就表示該表當(dāng)前用的存儲(chǔ)引擎):
mysql show create table 表名;
MySQL數(shù)據(jù)庫(kù)引擎詳解
作為Java程序員,MySQL數(shù)據(jù)庫(kù)大家平時(shí)應(yīng)該都沒(méi)少使用吧,對(duì)MySQL數(shù)據(jù)庫(kù)的引擎應(yīng)該也有所了解,這篇文章就讓我詳細(xì)的說(shuō)說(shuō)MySQL數(shù)據(jù)庫(kù)的Innodb和MyIASM兩種引擎以及其索引結(jié)構(gòu)。也來(lái)鞏固一下自己對(duì)這塊知識(shí)的掌握。
Innodb引擎
Innodb引擎提供了對(duì)數(shù)據(jù)庫(kù)ACID事務(wù)的支持,并且實(shí)現(xiàn)了SQL標(biāo)準(zhǔn)的四種隔離級(jí)別,關(guān)于數(shù)據(jù)庫(kù)事務(wù)與其隔離級(jí)別的內(nèi)容請(qǐng)見(jiàn)數(shù)據(jù)庫(kù)事務(wù)與其隔
離級(jí)別這篇文章。該引擎還提供了行級(jí)鎖和外鍵約束,它的設(shè)計(jì)目標(biāo)是處理大容量數(shù)據(jù)庫(kù)系統(tǒng),它本身其實(shí)就是基于MySQL后臺(tái)的完整數(shù)據(jù)庫(kù)系統(tǒng),MySQL
運(yùn)行時(shí)Innodb會(huì)在內(nèi)存中建立緩沖池,用于緩沖數(shù)據(jù)和索引。但是該引擎不支持FULLTEXT類(lèi)型的索引,而且它沒(méi)有保存表的行數(shù),當(dāng)SELECT
COUNT(*) FROM
TABLE時(shí)需要掃描全表。當(dāng)需要使用數(shù)據(jù)庫(kù)事務(wù)時(shí),該引擎當(dāng)然是首選。由于鎖的粒度更小,寫(xiě)操作不會(huì)鎖定全表,所以在并發(fā)較高時(shí),使用Innodb引擎
會(huì)提升效率。但是使用行級(jí)鎖也不是絕對(duì)的,如果在執(zhí)行一個(gè)SQL語(yǔ)句時(shí)MySQL不能確定要掃描的范圍,InnoDB表同樣會(huì)鎖全表。
MyIASM引擎
MyIASM是MySQL默認(rèn)的引擎,但是它沒(méi)有提供對(duì)數(shù)據(jù)庫(kù)事務(wù)的支持,也不支持行級(jí)鎖和外鍵,因此當(dāng)INSERT(插入)或UPDATE(更
新)數(shù)據(jù)時(shí)即寫(xiě)操作需要鎖定整個(gè)表,效率便會(huì)低一些。不過(guò)和Innodb不同,MyIASM中存儲(chǔ)了表的行數(shù),于是SELECT COUNT(*)
FROM
TABLE時(shí)只需要直接讀取已經(jīng)保存好的值而不需要進(jìn)行全表掃描。如果表的讀操作遠(yuǎn)遠(yuǎn)多于寫(xiě)操作且不需要數(shù)據(jù)庫(kù)事務(wù)的支持,那么MyIASM也是很好的選
擇。
兩種引擎的選擇
大尺寸的數(shù)據(jù)集趨向于選擇InnoDB引擎,因?yàn)樗С质聞?wù)處理和故障恢復(fù)。數(shù)據(jù)庫(kù)的大小決定了故障恢復(fù)的時(shí)間長(zhǎng)短,InnoDB可以利用事務(wù)日志
進(jìn)行數(shù)據(jù)恢復(fù),這會(huì)比較快。主鍵查詢?cè)贗nnoDB引擎下也會(huì)相當(dāng)快,不過(guò)需要注意的是如果主鍵太長(zhǎng)也會(huì)導(dǎo)致性能問(wèn)題,關(guān)于這個(gè)問(wèn)題我會(huì)在下文中講到。大
批的INSERT語(yǔ)句(在每個(gè)INSERT語(yǔ)句中寫(xiě)入多行,批量插入)在MyISAM下會(huì)快一些,但是UPDATE語(yǔ)句在InnoDB下則會(huì)更快一些,尤
其是在并發(fā)量大的時(shí)候。
Index——索引
索引(Index)是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)。MyIASM和Innodb都使用了樹(shù)這種數(shù)據(jù)結(jié)構(gòu)做為索引,關(guān)于樹(shù)我也曾經(jīng)寫(xiě)過(guò)一篇文章樹(shù)是一種偉大的數(shù)據(jù)結(jié)構(gòu),只是自己的理解,有興趣的朋友可以去閱讀。下面我接著講這兩種引擎使用的索引結(jié)構(gòu),講到這里,首先應(yīng)該談一下B-Tree和B+Tree。
B-Tree和B+Tree
B+Tree是B-Tree的變種,那么我就先講B-Tree吧,相信大家都知道紅黑樹(shù),這是我前段時(shí)間學(xué)《算法》一書(shū)時(shí),實(shí)現(xiàn)的一顆紅黑樹(shù),大家
可以參考。其實(shí)紅黑樹(shù)類(lèi)似2,3-查找樹(shù),這種樹(shù)既有2叉結(jié)點(diǎn)又有3叉結(jié)點(diǎn)。B-Tree也與之類(lèi)似,它的每個(gè)結(jié)點(diǎn)做多可以有d個(gè)分支(叉),d稱(chēng)為B-
Tree的度,如下圖所示,它的每個(gè)結(jié)點(diǎn)可以有4個(gè)元素,5個(gè)分支,于是它的度為5。B-Tree中的元素是有序的,比如圖中元素7左邊的指針指向的結(jié)點(diǎn)
中的元素都小于7,而元素7和16之間的指針指向的結(jié)點(diǎn)中的元素都處于7和16之間,正是滿足這樣的關(guān)系,才能高效的查找:首先從根節(jié)點(diǎn)進(jìn)行二分查找,找
到就返回對(duì)應(yīng)的值,否則就進(jìn)入相應(yīng)的區(qū)間結(jié)點(diǎn)遞歸的查找,直到找到對(duì)應(yīng)的元素或找到null指針,找到null指針則表示查找失敗。這個(gè)查找是十分高效
的,其時(shí)間復(fù)雜度為O(logN)(以d為底,當(dāng)d很大時(shí),樹(shù)的高度就很低),因?yàn)槊看螜z索最多只需要檢索樹(shù)高h(yuǎn)個(gè)結(jié)點(diǎn)。
接下來(lái)就該講B+Tree了,它是B-Tree的變種,如下面兩張圖所示:
vcHLx/i85LLp0a/Qp8LKoaM8L3A+DQo8aDMgaWQ9"myisam引擎的索引結(jié)構(gòu)"MyISAM引擎的索引結(jié)構(gòu)
MyISAM引擎的索引結(jié)構(gòu)為B+Tree,其中B+Tree的數(shù)據(jù)域存儲(chǔ)的內(nèi)容為實(shí)際數(shù)據(jù)的地址,也就是說(shuō)它的索引和實(shí)際的數(shù)據(jù)是分開(kāi)的,只不過(guò)是用索引指向了實(shí)際的數(shù)據(jù),這種索引就是所謂的非聚集索引。
Innodb引擎的索引結(jié)構(gòu)
MyISAM引擎的索引結(jié)構(gòu)同樣也是B+Tree,但是Innodb的索引文件本身就是數(shù)據(jù)文件,即B+Tree的數(shù)據(jù)域存儲(chǔ)的就是實(shí)際的數(shù)據(jù),這種索引就是聚集索引。這個(gè)索引的key就是數(shù)據(jù)表的主鍵,因此InnoDB表數(shù)據(jù)文件本身就是主索引。
因?yàn)镮nnoDB的數(shù)據(jù)文件本身要按主鍵聚集,所以InnoDB要求表必須有主鍵(MyISAM可以沒(méi)有),如果沒(méi)有顯式指定,則MySQL系統(tǒng)會(huì)自動(dòng)選擇一個(gè)可以唯一標(biāo)識(shí)數(shù)據(jù)記錄的列作為主鍵,如果不存在這種列,則MySQL自動(dòng)為InnoDB表生成一個(gè)隱含字段作為主鍵,這個(gè)字段長(zhǎng)度為6個(gè)字節(jié),類(lèi)型為長(zhǎng)整形。
并且和MyISAM不同,InnoDB的輔助索引數(shù)據(jù)域存儲(chǔ)的也是相應(yīng)記錄主鍵的值而不是地址,所以當(dāng)以輔助索引查找時(shí),會(huì)先根據(jù)輔助索引找到主
鍵,再根據(jù)主鍵索引找到實(shí)際的數(shù)據(jù)。所以Innodb不建議使用過(guò)長(zhǎng)的主鍵,否則會(huì)使輔助索引變得過(guò)大。建議使用自增的字段作為主鍵,這樣B+Tree的
每一個(gè)結(jié)點(diǎn)都會(huì)被順序的填滿,而不會(huì)頻繁的分裂調(diào)整,會(huì)有效的提升插入數(shù)據(jù)的效率。
查看MySQL 支持的存儲(chǔ)引擎有三種語(yǔ)句格式:
格式一:SHOW ENGINES;
格式二:SHOW ENGINES\g
格式三:SHOW ENGINES\G
這三種格式區(qū)別僅在于使用的“結(jié)束符”不同,這會(huì)導(dǎo)致“命令執(zhí)行結(jié)果的顯示”不同。其中“\G”的顯示效果最好,對(duì)所支持的各種存儲(chǔ)引擎會(huì)從“引擎名稱(chēng)”、“是否支持該引擎”、“關(guān)于該引擎的說(shuō)明、評(píng)論”、“是不是支持事務(wù)”、“該引擎支持的分布式是否支持XA規(guī)范”、“是否支持事務(wù)處理中的保存點(diǎn)”等方面逐個(gè)地、詳細(xì)地顯示出來(lái);使用“;”和“\g”作用相同,僅簡(jiǎn)單顯示各個(gè)存儲(chǔ)引擎的信息。
一般情況下,mysql會(huì)默認(rèn)提供多種存儲(chǔ)引擎,你可以通過(guò)下面的查看: 看你的mysql現(xiàn)在已提供什么存儲(chǔ)引擎: mysql show engines; 看你的mysql當(dāng)前默認(rèn)的存儲(chǔ)引擎: mysql show variables like '%storage_engine%'; 你要看某個(gè)表用了什么引擎(在顯示結(jié)果里參數(shù)engine后面的就表示該表當(dāng)前用的存儲(chǔ)引擎): mysql show create table 表名;