整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          蝦皮二面:MySQL支持哪些存儲(chǔ)引擎?MyISAM和

          蝦皮二面:MySQL支持哪些存儲(chǔ)引擎?MyISAM和InnoDB的區(qū)別什么?

          文鏈接:https://mp.weixin.qq.com/s/2Vu1DDJKUu79Ns5YK-VFaQ

          分享一道群友面試蝦皮遇到的 MySQL 面試真題。原面試題如下:

          1. MySQL 支持哪些存儲(chǔ)引擎?如何查看?默認(rèn)使用哪個(gè)?
          2. 存儲(chǔ)引擎基于數(shù)據(jù)庫還是表?
          3. MyISAM 和 InnoDB 的區(qū)別是什么?如何選擇?

          昨天抽了一晚上對(duì)這些問題進(jìn)行了解答,希望對(duì)準(zhǔn)備面試以及 MySQL 復(fù)習(xí)知識(shí)點(diǎn)的小伙伴有幫助。

          馬上秋招就來了,最近一直在抽時(shí)間更新面試真題(原創(chuàng)不易,有幫助的話,點(diǎn)贊分享就是對(duì) Guide 最大的鼓勵(lì)):

          • 招銀網(wǎng)絡(luò)一面:Spring,Spring MVC,Spring Boot 之間什么關(guān)系?
          • 招銀網(wǎng)絡(luò)一面:@Autowired 和 @Resource 的區(qū)別是什么?
          • 招銀網(wǎng)絡(luò)二面:什么是序列化?常見的序列化協(xié)議有哪些?
          • 某大廠面試:什么是字節(jié)碼?為什么說 Java 語言“編譯與解釋并存”?
          • 某小廠面試題:深拷貝和淺拷貝區(qū)別了解嗎?什么是引用拷貝?
          • 阿里云二面:String 為什么不可變?
          • 阿里云二面:簡(jiǎn)單聊聊 Java 虛擬機(jī)棧!
          • 金蝶一面:基本數(shù)據(jù)類型有哪些?包裝類型的常量池技術(shù)了解么?
          • 蝦皮二面:Spring Bean 默認(rèn)是單例的,如何保證并發(fā)安全?

          MySQL 核心在于存儲(chǔ)引擎,想要深入學(xué)習(xí) MySQL,必定要深入研究 MySQL 存儲(chǔ)引擎。

          MySQL 支持哪些存儲(chǔ)引擎?默認(rèn)使用哪個(gè)?

          MySQL 支持多種存儲(chǔ)引擎,你可以通過 show engines 命令來查看 MySQL 支持的所有存儲(chǔ)引擎。

          查看 MySQL 提供的所有存儲(chǔ)引擎

          從上圖我們可以查看出, MySQL 當(dāng)前默認(rèn)的存儲(chǔ)引擎是 InnoDB。并且,所有的存儲(chǔ)引擎中只有 InnoDB 是事務(wù)性存儲(chǔ)引擎,也就是說只有 InnoDB 支持事務(wù)。

          我這里使用的 MySQL 版本是 8.x,不同的 MySQL 版本之間可能會(huì)有差別。

          MySQL 5.5.5 之前,MyISAM 是 MySQL 的默認(rèn)存儲(chǔ)引擎。5.5.5 版本之后,InnoDB 是 MySQL 的默認(rèn)存儲(chǔ)引擎。

          你可以通過 select version() 命令查看你的 MySQL 版本。

           mysql> select version();
          +-----------+
          | version() |
          +-----------+
          | 8.0.27    |
          +-----------+
          1 row in set (0.00 sec)
          

          你也可以通過 show variables like '%storage_engine%' 命令直接查看 MySQL 當(dāng)前默認(rèn)的存儲(chǔ)引擎。

          查看 MySQL 當(dāng)前默認(rèn)的存儲(chǔ)引擎

          如果你只想查看數(shù)據(jù)庫中某個(gè)表使用的存儲(chǔ)引擎的話,可以使用 show table status from db_name where name='table_name'命令。

          查看表的存儲(chǔ)引擎

          如果你想要深入了解每個(gè)存儲(chǔ)引擎以及它們之間的區(qū)別,推薦你去閱讀以下 MySQL 官方文檔對(duì)應(yīng)的介紹(面試不會(huì)問這么細(xì),了解即可):

          • InnoDB 存儲(chǔ)引擎詳細(xì)介紹:https://dev.mysql.com/doc/refman/8.0/en/innodb-storage-engine.html 。
          • 其他存儲(chǔ)引擎詳細(xì)介紹:https://dev.mysql.com/doc/refman/8.0/en/storage-engines.html 。

          MySQL 存儲(chǔ)引擎架構(gòu)了解嗎?

          MySQL 存儲(chǔ)引擎采用的是插件式架構(gòu),支持多種存儲(chǔ)引擎,我們甚至可以為不同的數(shù)據(jù)庫表設(shè)置不同的存儲(chǔ)引擎以適應(yīng)不同場(chǎng)景的需要。存儲(chǔ)引擎是基于表的,而不是數(shù)據(jù)庫。

          并且,你還可以根據(jù) MySQL 定義的存儲(chǔ)引擎實(shí)現(xiàn)標(biāo)準(zhǔn)接口來編寫一個(gè)屬于自己的存儲(chǔ)引擎。這些非官方提供的存儲(chǔ)引擎可以稱為第三方存儲(chǔ)引擎,區(qū)別于官方存儲(chǔ)引擎。像目前最常用的 InnoDB 其實(shí)剛開始就是一個(gè)第三方存儲(chǔ)引擎,后面由于過于優(yōu)秀,其被 Oracle 直接收購了。

          MySQL 官方文檔也有介紹到如何編寫一個(gè)自定義存儲(chǔ)引擎,地址:https://dev.mysql.com/doc/internals/en/custom-engine.html 。

          MyISAM 和 InnoDB 的區(qū)別是什么?

          MySQL 5.5 之前,MyISAM 引擎是 MySQL 的默認(rèn)存儲(chǔ)引擎,可謂是風(fēng)光一時(shí)。

          雖然,MyISAM 的性能還行,各種特性也還不錯(cuò)(比如全文索引、壓縮、空間函數(shù)等)。但是,MyISAM 不支持事務(wù)和行級(jí)鎖,而且最大的缺陷就是崩潰后無法安全恢復(fù)。

          MySQL 5.5.5 之前,MyISAM 是 MySQL 的默認(rèn)存儲(chǔ)引擎。5.5.5 版本之后,InnoDB 是 MySQL 的默認(rèn)存儲(chǔ)引擎。

          言歸正傳!咱們下面還是來簡(jiǎn)單對(duì)比一下兩者:

          1.是否支持行級(jí)鎖

          MyISAM 只有表級(jí)鎖(table-level locking),而 InnoDB 支持行級(jí)鎖(row-level locking)和表級(jí)鎖,默認(rèn)為行級(jí)鎖。

          也就說,MyISAM 一鎖就是鎖住了整張表,這在并發(fā)寫的情況下是多么滴憨憨啊!這也是為什么 InnoDB 在并發(fā)寫的時(shí)候,性能更牛皮了!

          2.是否支持事務(wù)

          MyISAM 不提供事務(wù)支持。

          InnoDB 提供事務(wù)支持,實(shí)現(xiàn)了 SQL 標(biāo)準(zhǔn)定義了四個(gè)隔離級(jí)別,具有提交(commit)和回滾(rollback)事務(wù)的能力。并且,InnoDB 默認(rèn)使用的 REPEATABLE-READ(可重讀)隔離級(jí)別是可以解決幻讀問題發(fā)生的(基于 MVCC 和 Next-Key Lock)。

          關(guān)于 MySQL 事務(wù)的詳細(xì)介紹,可以看看我寫的這篇文章:MySQL 事務(wù)隔離級(jí)別詳解[1]

          3.是否支持外鍵

          MyISAM 不支持,而 InnoDB 支持。

          外鍵對(duì)于維護(hù)數(shù)據(jù)一致性非常有幫助,但是對(duì)性能有一定的損耗。因此,通常情況下,我們是不建議在實(shí)際生產(chǎn)項(xiàng)目中使用外鍵的,在業(yè)務(wù)代碼中進(jìn)行約束即可!

          阿里的《Java 開發(fā)手冊(cè)》也是明確規(guī)定禁止使用外鍵的。

          不過,在代碼中進(jìn)行約束的話,對(duì)程序員的能力要求更高,具體是否要采用外鍵還是要根據(jù)你的項(xiàng)目實(shí)際情況而定。

          總結(jié):一般我們也是不建議在數(shù)據(jù)庫層面使用外鍵的,應(yīng)用層面可以解決。不過,這樣會(huì)對(duì)數(shù)據(jù)的一致性造成威脅。具體要不要使用外鍵還是要根據(jù)你的項(xiàng)目來決定。

          4.是否支持?jǐn)?shù)據(jù)庫異常崩潰后的安全恢復(fù)

          MyISAM 不支持,而 InnoDB 支持。

          使用 InnoDB 的數(shù)據(jù)庫在異常崩潰后,數(shù)據(jù)庫重新啟動(dòng)的時(shí)候會(huì)保證數(shù)據(jù)庫恢復(fù)到崩潰前的狀態(tài)。這個(gè)恢復(fù)的過程依賴于 redo log

          5.是否支持 MVCC

          MyISAM 不支持,而 InnoDB 支持。

          講真,這個(gè)對(duì)比有點(diǎn)廢話,畢竟 MyISAM 連行級(jí)鎖都不支持。MVCC 可以看作是行級(jí)鎖的一個(gè)升級(jí),可以有效減少加鎖操作,提高性能。

          6.索引實(shí)現(xiàn)不一樣。

          雖然 MyISAM 引擎和 InnoDB 引擎都是使用 B+Tree 作為索引結(jié)構(gòu),但是兩者的實(shí)現(xiàn)方式不太一樣。

          InnoDB 引擎中,其數(shù)據(jù)文件本身就是索引文件。相比 MyISAM,索引文件和數(shù)據(jù)文件是分離的,其表數(shù)據(jù)文件本身就是按 B+Tree 組織的一個(gè)索引結(jié)構(gòu),樹的葉節(jié)點(diǎn) data 域保存了完整的數(shù)據(jù)記錄。

          詳細(xì)區(qū)別,推薦你看看我寫的這篇文章:MySQL 索引詳解[2]

          MyISAM 和 InnoDB 如何選擇?

          大多數(shù)時(shí)候我們使用的都是 InnoDB 存儲(chǔ)引擎,在某些讀密集的情況下,使用 MyISAM 也是合適的。不過,前提是你的項(xiàng)目不介意 MyISAM 不支持事務(wù)、崩潰恢復(fù)等缺點(diǎn)(可是~我們一般都會(huì)介意啊!)。

          《MySQL 高性能》上面有一句話這樣寫到:

          不要輕易相信“MyISAM 比 InnoDB 快”之類的經(jīng)驗(yàn)之談,這個(gè)結(jié)論往往不是絕對(duì)的。在很多我們已知場(chǎng)景中,InnoDB 的速度都可以讓 MyISAM 望塵莫及,尤其是用到了聚簇索引,或者需要訪問的數(shù)據(jù)都可以放入內(nèi)存的應(yīng)用。

          一般情況下我們選擇 InnoDB 都是沒有問題的,但是某些情況下你并不在乎可擴(kuò)展能力和并發(fā)能力,也不需要事務(wù)支持,也不在乎崩潰后的安全恢復(fù)問題的話,選擇 MyISAM 也是一個(gè)不錯(cuò)的選擇。但是一般情況下,我們都是需要考慮到這些問題的。

          因此,對(duì)于咱們?nèi)粘i_發(fā)的業(yè)務(wù)系統(tǒng)來說,你幾乎找不到什么理由再使用 MyISAM 作為自己的 MySQL 數(shù)據(jù)庫的存儲(chǔ)引擎。

          本篇文章主要介紹了前端HTML5幾種存儲(chǔ)方式的總結(jié) ,主要包括本地存儲(chǔ)localstorage,本地存儲(chǔ)sessionstorage,離線緩存(application cache),Web SQL,IndexedDB。有興趣的可以了解一下。

          正文開始~

          總體情況

          h5之前,存儲(chǔ)主要是用cookies。cookies缺點(diǎn)有在請(qǐng)求頭上帶著數(shù)據(jù),大小是4k之內(nèi)。主Domain污染。

          主要應(yīng)用:購物車、客戶登錄

          對(duì)于IE瀏覽器有UserData,大小是64k,只有IE瀏覽器支持。

          目標(biāo)

          1. 解決4k的大小問題
          2. 解決請(qǐng)求頭常帶存儲(chǔ)信息的問題
          3. 解決關(guān)系型存儲(chǔ)的問題
          4. 跨瀏覽器

          1.本地存儲(chǔ)localstorage

          存儲(chǔ)方式:

          以鍵值對(duì)(Key-Value)的方式存儲(chǔ),永久存儲(chǔ),永不失效,除非手動(dòng)刪除。

          大小:

          每個(gè)域名5M

          支持情況:

          注意:IE9 localStorage不支持本地文件,需要將項(xiàng)目署到服務(wù)器,才可以支持!

          if(window.localStorage){
           
           alert('This browser supports localStorage');
           
          }else{
           
           alert('This browser does NOT support localStorage');
           
          } 
          

          常用的API:

          getItem //取記錄

          setIten//設(shè)置記錄

          removeItem//移除記錄

          key//取key所對(duì)應(yīng)的值

          clear//清除記錄

          存儲(chǔ)的內(nèi)容:

          數(shù)組,圖片,json,樣式,腳本。。。(只要是能序列化成字符串的內(nèi)容都可以存儲(chǔ))

          2.本地存儲(chǔ)sessionstorage

          HTML5 的本地存儲(chǔ) API 中的 localStorage 與 sessionStorage 在使用方法上是相同的,區(qū)別在于 sessionStorage 在關(guān)閉頁面后即被清空,而 localStorage 則會(huì)一直保存。

          3.離線緩存(application cache)

          本地緩存應(yīng)用所需的文件

          使用方法:

          ①配置manifest文件

          頁面上:

          <!DOCTYPE HTML>
           
          <html manifest="demo.appcache">
           
          ...
           
          </html> 
          

          Manifest 文件:

          manifest 文件是簡(jiǎn)單的文本文件,它告知瀏覽器被緩存的內(nèi)容(以及不緩存的內(nèi)容)。

          manifest 文件可分為三個(gè)部分:

          ①CACHE MANIFEST - 在此標(biāo)題下列出的文件將在首次下載后進(jìn)行緩存

          ②NETWORK - 在此標(biāo)題下列出的文件需要與服務(wù)器的連接,且不會(huì)被緩存

          ③FALLBACK - 在此標(biāo)題下列出的文件規(guī)定當(dāng)頁面無法訪問時(shí)的回退頁面(比如 404 頁面)

          完整demo:

          CACHE MANIFEST
           
          # 2016-07-24 v1.0.0
           
          /theme.css
           
          /main.js
           
           
           
          NETWORK:
           
          login.jsp
           
           
           
          FALLBACK:
           
          /html/ /offline.html 
          

          服務(wù)器上:manifest文件需要配置正確的MIME-type,即 "text/cache-manifest"。

          如Tomcat:

          <mime-mapping>
           
           <extension>manifest</extension>
           
           <mime-type>text/cache-manifest</mime-type>
           
          </mime-mapping> 
          

          常用API:

          核心是applicationCache對(duì)象,有個(gè)status屬性,表示應(yīng)用緩存的當(dāng)前狀態(tài):

          0(UNCACHED) : 無緩存, 即沒有與頁面相關(guān)的應(yīng)用緩存

          1(IDLE) : 閑置,即應(yīng)用緩存未得到更新

          2 (CHECKING) : 檢查中,即正在下載描述文件并檢查更新

          3 (DOWNLOADING) : 下載中,即應(yīng)用緩存正在下載描述文件中指定的資源

          4 (UPDATEREADY) : 更新完成,所有資源都已下載完畢

          5 (IDLE) : 廢棄,即應(yīng)用緩存的描述文件已經(jīng)不存在了,因此頁面無法再訪問應(yīng)用緩存

          相關(guān)的事件:

          表示應(yīng)用緩存狀態(tài)的改變:

          checking : 在瀏覽器為應(yīng)用緩存查找更新時(shí)觸發(fā)

          error : 在檢查更新或下載資源期間發(fā)送錯(cuò)誤時(shí)觸發(fā)

          noupdate : 在檢查描述文件發(fā)現(xiàn)文件無變化時(shí)觸發(fā)

          downloading : 在開始下載應(yīng)用緩存資源時(shí)觸發(fā)

          progress:在文件下載應(yīng)用緩存的過程中持續(xù)不斷地下載地觸發(fā)

          updateready : 在頁面新的應(yīng)用緩存下載完畢觸發(fā)

          cached : 在應(yīng)用緩存完整可用時(shí)觸發(fā)

          Application Cache的三個(gè)優(yōu)勢(shì):

          ① 離線瀏覽

          ② 提升頁面載入速度

          ③ 降低服務(wù)器壓力

          注意事項(xiàng):

          1. 瀏覽器對(duì)緩存數(shù)據(jù)的容量限制可能不太一樣(某些瀏覽器設(shè)置的限制是每個(gè)站點(diǎn) 5MB)

          2. 如果manifest文件,或者內(nèi)部列舉的某一個(gè)文件不能正常下載,整個(gè)更新過程將視為失敗,瀏覽器繼續(xù)全部使用老的緩存

          3. 引用manifest的html必須與manifest文件同源,在同一個(gè)域下

          4. 瀏覽器會(huì)自動(dòng)緩存引用manifest文件的HTML文件,這就導(dǎo)致如果改了HTML內(nèi)容,也需要更新版本才能做到更新。

          5. manifest文件中CACHE則與NETWORK,F(xiàn)ALLBACK的位置順序沒有關(guān)系,如果是隱式聲明需要在最前面

          6. FALLBACK中的資源必須和manifest文件同源

          7. 更新完版本后,必須刷新一次才會(huì)啟動(dòng)新版本(會(huì)出現(xiàn)重刷一次頁面的情況),需要添加監(jiān)聽版本事件。

          8. 站點(diǎn)中的其他頁面即使沒有設(shè)置manifest屬性,請(qǐng)求的資源如果在緩存中也從緩存中訪問

          9. 當(dāng)manifest文件發(fā)生改變時(shí),資源請(qǐng)求本身也會(huì)觸發(fā)更新

          離線緩存與傳統(tǒng)瀏覽器緩存區(qū)別:

          1. 離線緩存是針對(duì)整個(gè)應(yīng)用,瀏覽器緩存是單個(gè)文件

          2. 離線緩存斷網(wǎng)了還是可以打開頁面,瀏覽器緩存不行

          3. 離線緩存可以主動(dòng)通知瀏覽器更新資源

          4.Web SQL

          關(guān)系數(shù)據(jù)庫,通過SQL語句訪問

          Web SQL 數(shù)據(jù)庫 API 并不是 HTML5 規(guī)范的一部分,但是它是一個(gè)獨(dú)立的規(guī)范,引入了一組使用 SQL 操作客戶端數(shù)據(jù)庫的 APIs。

          支持情況:

          Web SQL 數(shù)據(jù)庫可以在最新版的 Safari, Chrome 和 Opera 瀏覽器中工作。

          核心方法:

          ①openDatabase:這個(gè)方法使用現(xiàn)有的數(shù)據(jù)庫或者新建的數(shù)據(jù)庫創(chuàng)建一個(gè)數(shù)據(jù)庫對(duì)象。

          ②transaction:這個(gè)方法讓我們能夠控制一個(gè)事務(wù),以及基于這種情況執(zhí)行提交或者回滾。

          ③executeSql:這個(gè)方法用于執(zhí)行實(shí)際的 SQL 查詢。

          打開數(shù)據(jù)庫:

          var db=openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024,fn);
           
          //openDatabase() 方法對(duì)應(yīng)的五個(gè)參數(shù)分別為:數(shù)據(jù)庫名稱、版本號(hào)、描述文本、數(shù)據(jù)庫大小、創(chuàng)建回調(diào)
          

          執(zhí)行查詢操作:

          var db=openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024);
           
          db.transaction(function (tx) { 
           
           tx.executeSql('CREATE TABLE IF NOT EXISTS WIN (id unique, name)');
           
          }); 
          

          插入數(shù)據(jù): 

          var db=openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024);
           
          db.transaction(function (tx) {
           
           tx.executeSql('CREATE TABLE IF NOT EXISTS WIN (id unique, name)');
           
           tx.executeSql('INSERT INTO WIN (id, name) VALUES (1, "winty")');
           
           tx.executeSql('INSERT INTO WIN (id, name) VALUES (2, "LuckyWinty")');
           
          }); 
          

          讀取數(shù)據(jù):

          db.transaction(function (tx) {
           
           tx.executeSql('SELECT * FROM WIN', [], function (tx, results) {
           
           var len=results.rows.length, i;
           
           msg="<p>查詢記錄條數(shù): " + len + "</p>";
           
           document.querySelector('#status').innerHTML +=msg; 
           
           for (i=0; i < len; i++){
           
           alert(results.rows.item(i).name );
           
           }
           
           }, null);
           
          }); 
          

          由這些操作可以看出,基本上都是用SQL語句進(jìn)行數(shù)據(jù)庫的相關(guān)操作,如果你會(huì)MySQL的話,這個(gè)應(yīng)該比較容易用。

          5.IndexedDB

          索引數(shù)據(jù)庫 (IndexedDB) API(作為 HTML5 的一部分)對(duì)創(chuàng)建具有豐富本地存儲(chǔ)數(shù)據(jù)的數(shù)據(jù)密集型的離線 HTML5 Web 應(yīng)用程序很有用。同時(shí)它還有助于本地緩存數(shù)據(jù),使傳統(tǒng)在線 Web 應(yīng)用程序(比如移動(dòng) Web 應(yīng)用程序)能夠更快地運(yùn)行和響應(yīng)。

          異步API:

          在IndexedDB大部分操作并不是我們常用的調(diào)用方法,返回結(jié)果的模式,而是請(qǐng)求——響應(yīng)的模式,比如打開數(shù)據(jù)庫的操作

          這樣,我們打開數(shù)據(jù)庫的時(shí)候,實(shí)質(zhì)上返回了一個(gè)DB對(duì)象,而這個(gè)對(duì)象就在result中。由上圖可以看出,除了result之外。還有幾個(gè)重要的屬性就是onerror、onsuccess、onupgradeneeded(我們請(qǐng)求打開的數(shù)據(jù)庫的版本號(hào)和已經(jīng)存在的數(shù)據(jù)庫版本號(hào)不一致的時(shí)候調(diào)用)。這就類似于我們的ajax請(qǐng)求那樣。我們發(fā)起了這個(gè)請(qǐng)求之后并不能確定它什么時(shí)候才請(qǐng)求成功,所以需要在回調(diào)中處理一些邏輯。

          關(guān)閉與刪除:

          function closeDB(db){
           
           db.close();
           
          }
           
          function deleteDB(name){
           
           indexedDB.deleteDatabase(name);
           
          } 
          

          數(shù)據(jù)存儲(chǔ):

          indexedDB中沒有表的概念,而是objectStore,一個(gè)數(shù)據(jù)庫中可以包含多個(gè)objectStore,objectStore是一個(gè)靈活的數(shù)據(jù)結(jié)構(gòu),可以存放多種類型數(shù)據(jù)。也就是說一個(gè)objectStore相當(dāng)于一張表,里面存儲(chǔ)的每條數(shù)據(jù)和一個(gè)鍵相關(guān)聯(lián)。

          我們可以使用每條記錄中的某個(gè)指定字段作為鍵值(keyPath),也可以使用自動(dòng)生成的遞增數(shù)字作為鍵值(keyGenerator),也可以不指定。選擇鍵的類型不同,objectStore可以存儲(chǔ)的數(shù)據(jù)結(jié)構(gòu)也有差異。

          學(xué)習(xí)從來不是一個(gè)人的事情,要有個(gè)相互監(jiān)督的伙伴,想要學(xué)習(xí)或交流前端問題的小伙伴可以私信“學(xué)習(xí)”小明獲取web前端入門資料,一起學(xué)習(xí),一起成長!

          骨文公司宣布在 MySQL 中將引入對(duì) JavaScript 的支持,這一消息在前端、后端技術(shù)圈引起了廣泛關(guān)注。本文首先闡述MySQL 中將引入對(duì) JavaScript 的支持的背景及應(yīng)用實(shí)踐,最后從前端視角來分析這一變化會(huì)給前端開發(fā)人員帶來哪些利好。

          1.MySQL-JavaScript 背景介紹

          MySQL 不斷進(jìn)行創(chuàng)新,現(xiàn)在數(shù)據(jù)庫中包含了豐富的程序編程功能。開發(fā)人員現(xiàn)在可以在 MySQL 數(shù)據(jù)庫服務(wù)器中編寫 JavaScript 存儲(chǔ)程序(函數(shù)和過程)。這些存儲(chǔ)程序?qū)⑼ㄟ^ GraalVM 運(yùn)行時(shí)間運(yùn)行。該功能在 MySQL 企業(yè)版中作為預(yù)覽版提供,可通過 Oracle Technology Network (OTN) 下載。MySQL-JavaScript 還可在 OCI、AWS 和 Azure 上的 MySQL Heatwave 云服務(wù)中使用。

          1.1.為什么要使用 JavaScript 存儲(chǔ)程序?

          JavaScript 是最受開發(fā)人員歡迎的編程語言。除了更簡(jiǎn)單的語法和對(duì)現(xiàn)代語言功能的支持外,其受歡迎的一個(gè)關(guān)鍵因素是豐富的生態(tài)系統(tǒng)提供了大量可重復(fù)使用的代碼模塊。

          當(dāng)需要持久存儲(chǔ)時(shí),最流行的開源數(shù)據(jù)庫 MySQL 將是 JavaScript 開發(fā)人員的自然選擇。通過在存儲(chǔ)程序中支持 JavaScript,開發(fā)人員將能用熟悉的語言編寫 MySQL 存儲(chǔ)程序,并利用廣泛的 JavaScript 生態(tài)系統(tǒng)!

          對(duì) JavaScript 存儲(chǔ)程序的支持,不僅可以利用龐大的生態(tài)系統(tǒng)提高開發(fā)人員的工作效率,還能讓更多開發(fā)人員掌握編寫存儲(chǔ)程序的必要技能。換句話說,企業(yè)現(xiàn)在可以利用廣泛可用的 JavaScript 技能集進(jìn)行后端開發(fā),從而發(fā)掘更多的開發(fā)人才。

          存儲(chǔ)程序的一個(gè)關(guān)鍵優(yōu)勢(shì)是最大限度地減少了數(shù)據(jù)庫服務(wù)器和應(yīng)用程序之間的數(shù)據(jù)移動(dòng)。出于多種原因,傳輸大量數(shù)據(jù)(尤其是批處理數(shù)據(jù))可能會(huì)造成很多問題:

          • 這不僅耗費(fèi)時(shí)間,還會(huì)造成巨大的網(wǎng)絡(luò)開銷。
          • 當(dāng)應(yīng)用程序進(jìn)行頻繁交互時(shí),延遲會(huì)明顯增加。
          • 在中間層或應(yīng)用層處理大量數(shù)據(jù)需要大量?jī)?nèi)存和存儲(chǔ)空間,從而增加了成本。
          • 由于安全風(fēng)險(xiǎn)和數(shù)據(jù)保護(hù)要求,通常必須避免機(jī)器之間的數(shù)據(jù)傳輸,尤其是在云環(huán)境中。
          • 在數(shù)據(jù)庫服務(wù)之外移動(dòng)大量數(shù)據(jù)會(huì)增加出口成本。

          使用存儲(chǔ)程序在數(shù)據(jù)庫內(nèi)處理數(shù)據(jù)是解決這些問題的常用方法。

          1.2.有哪些新的使用場(chǎng)景?

          MySQL-JavaScript 為應(yīng)用程序設(shè)計(jì)帶來了新的機(jī)遇,而這些機(jī)遇曾一度受限于權(quán)衡利弊。JavaScript 存儲(chǔ)程序使開發(fā)人員能夠避開數(shù)據(jù)移動(dòng),在數(shù)據(jù)庫內(nèi)輕松無縫地實(shí)現(xiàn)高級(jí)數(shù)據(jù)處理邏輯。下面列出了一些簡(jiǎn)單的用例:

          • 數(shù)據(jù)提取:從數(shù)據(jù)庫中常用的復(fù)雜對(duì)象(如 URL 字符串)中提取信息。
          • 數(shù)據(jù)格式化:使用廣泛使用的模板化方案(如 JavaScript 的 Mustache 包)生成格式化字符串。
          • 近似搜索:在 SELECT 查詢中使用相似性評(píng)分函數(shù),例如從表中檢索相似字符串。
          • 數(shù)據(jù)驗(yàn)證:使用復(fù)雜的驗(yàn)證規(guī)則清理數(shù)據(jù)。例如,使用 JavaScript Validator 軟件包。
          • 壓縮/編碼:使用不包含在 MySQL 中的自定義算法進(jìn)行數(shù)據(jù)壓縮和加密。
          • 數(shù)據(jù)轉(zhuǎn)換:更改數(shù)據(jù)表示,例如將字符串列轉(zhuǎn)換為特征工程中使用的稀疏矩陣表示。

          所提供的示例只是該功能潛力的一個(gè)縮影。還有更多復(fù)雜的用例,如部署完整的數(shù)據(jù)管道和為機(jī)器學(xué)習(xí)應(yīng)用建立暫存環(huán)境。

          1.3.MySQL-JavaScript

          MySQL 正在引入對(duì) JavaScript 存儲(chǔ)程序的支持。用戶現(xiàn)在可以在數(shù)據(jù)庫中表達(dá)豐富的程序邏輯。JavaScript 運(yùn)行時(shí)通過 GraalVM 集成,用戶可以免費(fèi)使用 GraalVM 的所有企業(yè)版 (EE) 功能,如編譯器優(yōu)化、性能和安全功能。

          該版本支持:

          • 基于 ECMAScript 2021 的 JavaScript 語言
          • 存儲(chǔ)過程和存儲(chǔ)函數(shù)
          • MySQL 數(shù)據(jù)類型,如整數(shù)、浮點(diǎn)數(shù)和 CHAR/VARCHAR 類型的所有變化

          ECMAScript 標(biāo)準(zhǔn)庫包括許多基本的使用操作和數(shù)據(jù)結(jié)構(gòu),使實(shí)現(xiàn)變得簡(jiǎn)單而富有表現(xiàn)力。開發(fā)人員還可以從在線軟件包管理器(如 "npm")中重用數(shù)百萬個(gè)可用的第三方軟件包。

          1.4.什么是 GraalVM?

          GraalVM 是 Oracle 的編譯器生態(tài)系統(tǒng),包括 JDK 以及 JavaScript、R、Python、Ruby 和 Java 等語言實(shí)現(xiàn)。它包括即時(shí)(JIT)和超前(AOT)編譯技術(shù)。它還提供了一個(gè)完全托管的虛擬機(jī),具有沙箱功能和工具支持。MySQL-JavaScript 與 GraalVM 企業(yè)版集成。

          2.MySQL-JavaScript 應(yīng)用實(shí)踐

          2.1.定義 JavaScript 存儲(chǔ)程序

          要在 MySQL 中創(chuàng)建 JavaScript 存儲(chǔ)程序,可以使用與傳統(tǒng)存儲(chǔ)函數(shù)和存儲(chǔ)過程相同的 SQL 語句變體:

          CREATE FUNCTION gcd_js (a INT, b INT) RETURNS INT 
          LANGUAGE JAVASCRIPT AS $$
          
            let [x, y]=[Math.abs(a), Math.abs(b)];
            while(y) [x, y]=[y, x % y];
            return x;
          
          $$;

          從上面的示例可以看出,JavaScript 代碼是直接嵌入到 SQL 可調(diào)用函數(shù)的定義中的。參數(shù)的名稱可以在 JavaScript 代碼中直接引用,當(dāng)函數(shù)被調(diào)用時(shí),SQL 類型和 JavaScript 類型之間將進(jìn)行隱式類型轉(zhuǎn)換。要調(diào)用 JavaScript 存儲(chǔ)過程,應(yīng)使用 CALL 語句,這與常規(guī)的 SQL 存儲(chǔ)過程類似。存儲(chǔ)過程支持輸入和輸出參數(shù)。

          2.2.在 SQL 語句內(nèi)執(zhí)行 JavaScript 代碼

          JavaScript 函數(shù)可以在任何可以調(diào)用傳統(tǒng) SQL 函數(shù)的 SQL 語句中調(diào)用,如 SELECT 表達(dá)式、WHERE、GROUP BY 和 ORDER BY 子句、DML、DDL、視圖等。下面是一個(gè)調(diào)用我們?cè)谏厦娑x的函數(shù)的 SQL 語句示例:

          SELECT col1, col2, gcd_js(col1,col2)
          FROM my_table
          WHERE gcd_js(col1, col2) > 1
          ORDER BY gcd_js(col1, col2);
          
          CREATE TABLE gcd_table 
          AS SELECT gcd_js(col1,col2)
          FROM my_table;

          2.3.調(diào)試 MySQL 中的 JavaScript 代碼

          調(diào)試與軟件開發(fā)同步進(jìn)行。當(dāng) JavaScript 程序在數(shù)據(jù)庫中運(yùn)行時(shí),MySQL-JavaScript 功能會(huì)提供額外的 SQL 接口,以幫助排除故障。

          CREATE PROCEDURE division (IN a INT, IN b INT, OUT result DOUBLE) 
          LANGUAGE JAVASCRIPT AS $$
            function validate(num) {
              console.log("validating input value: ", num);
              if (num===0) throw ("Division by Zero!");
            }
            validate(b);
            result=a / b;
          $$

          JavaScript 異常與 MySQL 錯(cuò)誤之間的轉(zhuǎn)換是透明的。除標(biāo)準(zhǔn)輸出外,開發(fā)人員還可以訪問 JavaScript 堆棧跟蹤。

          CALL division( 5, 0, @res);
          ERROR 6000 (HY000): JavaScript> Division by Zero!
          
          SELECT mle_session_state("stdout");
          validating input value:  0
          
          SELECT mle_session_state("stack_trace");
          <js> validate(division:9:187-214)
          <js> division(division:11:222-232)
          <js> :anonymous(division:15:256-265)
          </js></js></js>

          3.MySQL-JavaScript 優(yōu)勢(shì)

          3.1.公認(rèn)的安全性

          MySQL 中的 JavaScript 支持可提供最高級(jí)別的安全性、隔離性和數(shù)據(jù)保護(hù)。MySQL 的 JavaScript 依賴于業(yè)界公認(rèn)的 Oracle GraalVM 安全保證。

          虛擬機(jī)沙盒可確保惡意代碼無法入侵 MySQL 服務(wù)器的其他模塊。每個(gè)存儲(chǔ)程序都在自己的上下文中解析和執(zhí)行。這種隔離策略不允許一個(gè)存儲(chǔ)程序讀取或修改其他存儲(chǔ)程序的數(shù)據(jù)或代碼。JavaScript 用戶代碼生成或操作線程受到限制,而且 JavaScript 用戶代碼無法訪問網(wǎng)絡(luò)通信或文件系統(tǒng)。

          JavaScript 存儲(chǔ)程序基于標(biāo)準(zhǔn)的 MySQL 權(quán)限模型。只有有權(quán)限的用戶才能創(chuàng)建存儲(chǔ)程序。對(duì) SP 的訪問也可以通過權(quán)限來控制。一個(gè)用戶可以定義其他用戶可以執(zhí)行的存儲(chǔ)程序。

          3.2.良好的兼容性

          JavaScript 存儲(chǔ)程序可與傳統(tǒng)的 SQL 存儲(chǔ)程序無縫兼容。該功能與存儲(chǔ)引擎無關(guān),可以透明地從 InnoDB、Lakehouse 和 HeatWave 訪問數(shù)據(jù)。

          MySQL Heatwave 服務(wù)現(xiàn)在已在 OCI、AWS 和 Azure 服務(wù)部署中預(yù)裝并配置了 JavaScript。對(duì)于 MySQL 企業(yè)版,該功能需要手動(dòng)安裝和配置。

          3.3.最佳的性能

          MySQL-JavaScript 集成針對(duì)其特定用例使用定制的虛擬機(jī),以實(shí)現(xiàn)最佳的端到端性能。這種定制基于 GraalVM 的超前(AOT)編譯,將語言實(shí)現(xiàn)編譯成本地二進(jìn)制表示法,以便快速處理。

          GraalVM 擁有自己基于 ECMAScript 2021 標(biāo)準(zhǔn)的 JavaScript 實(shí)現(xiàn)。該語言實(shí)現(xiàn)在性能方面很有競(jìng)爭(zhēng)力,盡管它是使用 GraalVM 的 Polyglot 框架實(shí)現(xiàn)的,該框架側(cè)重于在同一虛擬機(jī)中支持多種編程語言。

          最后,MySQL-JavaScript 功能還得益于 GraalVM 企業(yè)版的各種先進(jìn)優(yōu)化技術(shù),如編譯器優(yōu)化,包括積極的內(nèi)聯(lián)和部分轉(zhuǎn)義分析。這還包括一個(gè)配置文件引導(dǎo)的即時(shí)(JIT)編譯器,可在運(yùn)行時(shí)在解釋器和本地編譯之間切換。

          4.MySQL-JavaScript 帶來哪些利好?

          隨著全棧開發(fā)崗位在國內(nèi)外的普及,越來越多的開發(fā)者開始轉(zhuǎn)變?nèi)珬i_發(fā)人員或者工程師。全棧開發(fā)在大部分情況下對(duì)前端、后端、運(yùn)維工程師的工作職責(zé)進(jìn)行了整合,主要包括前端、后端 和 DevOps。在 MySQL 中將引入對(duì) JavaScript 的支持,對(duì)于前端或者全棧開發(fā)人員來說有以下好處:

          • 繼瀏覽器、服務(wù)端、客戶端之后,JavaScript 語言深入到數(shù)據(jù)庫領(lǐng)域。
          • 對(duì)于全棧開發(fā)人員,可以使用 JavaScript 在數(shù)據(jù)庫中處理更豐富的邏輯。
          • 對(duì)于前端開發(fā)人員,上手 MySQL-JavaScript 的成本將會(huì)更低一些。

          5.總結(jié)

          MySQL-JavaScript 使開發(fā)人員能夠直接在 MySQL 服務(wù)器中表達(dá)復(fù)雜的編程邏輯。這樣,開發(fā)人員就能將應(yīng)用程序中的數(shù)據(jù)密集型部分推近數(shù)據(jù),從而降低數(shù)據(jù)移動(dòng)成本。使用基于 ECMAScript 2021 的 JavaScript 可以防止供應(yīng)商鎖定問題,同時(shí)開發(fā)人員還可以享受 GraalVM(企業(yè)版)的所有優(yōu)勢(shì),而無需支付額外費(fèi)用。要免費(fèi)試用 MySQL-JavaScript,請(qǐng)從 Oracle Technology Network (OTN) 下載 MySQL 企業(yè)版。MySQL-JavaScript還與MySQL HeatWave云服務(wù)無縫集成,開發(fā)人員可通過指尖獲得最新的創(chuàng)新技術(shù)。MySQL向 JavaScript 集成的轉(zhuǎn)變預(yù)示著開發(fā)人員將獲得更多功能和更易用的環(huán)境


          主站蜘蛛池模板: 伦精品一区二区三区视频| 波多野结衣av高清一区二区三区| 亚洲老妈激情一区二区三区| 视频一区视频二区在线观看| jazzjazz国产精品一区二区| 国产激情无码一区二区| 亚洲国产AV一区二区三区四区 | 亚洲蜜芽在线精品一区| 国产麻豆媒一区一区二区三区| 中文字幕精品一区二区三区视频| 亚拍精品一区二区三区| 亚洲一区二区视频在线观看| 精品深夜AV无码一区二区老年| 国产日韩高清一区二区三区 | 国产精品合集一区二区三区| 国产综合无码一区二区辣椒| 福利电影一区二区| 无码丰满熟妇浪潮一区二区AV| 国产一区二区三区久久| 一区二区三区中文| 国产三级一区二区三区 | 色综合视频一区中文字幕| 福利一区二区三区视频在线观看 | 内射白浆一区二区在线观看 | 国产在线一区观看| 无码国产精品一区二区免费I6| 精品成人乱色一区二区| 亚洲视频一区二区三区四区| 2020天堂中文字幕一区在线观| 色欲综合一区二区三区| 久久精品国产一区二区三区肥胖| 久久一区二区三区免费| 久久se精品一区精品二区| 国产亚洲3p无码一区二区| 国产精品区一区二区三在线播放| 无码精品人妻一区二区三区人妻斩| 色欲AV蜜臀一区二区三区| 日韩视频一区二区三区| 在线观看精品视频一区二区三区| 国产精品盗摄一区二区在线| 国精品无码A区一区二区|