Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 在线观看亚洲免费,久久免费毛片,春色www视频在线观看

          整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

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

          蝦皮二面:MySQL支持哪些存儲引擎?MyISAM和InnoDB的區別什么?

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

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

          1. MySQL 支持哪些存儲引擎?如何查看?默認使用哪個?
          2. 存儲引擎基于數據庫還是表?
          3. MyISAM 和 InnoDB 的區別是什么?如何選擇?

          昨天抽了一晚上對這些問題進行了解答,希望對準備面試以及 MySQL 復習知識點的小伙伴有幫助。

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

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

          MySQL 核心在于存儲引擎,想要深入學習 MySQL,必定要深入研究 MySQL 存儲引擎。

          MySQL 支持哪些存儲引擎?默認使用哪個?

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

          查看 MySQL 提供的所有存儲引擎

          從上圖我們可以查看出, MySQL 當前默認的存儲引擎是 InnoDB。并且,所有的存儲引擎中只有 InnoDB 是事務性存儲引擎,也就是說只有 InnoDB 支持事務。

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

          MySQL 5.5.5 之前,MyISAM 是 MySQL 的默認存儲引擎。5.5.5 版本之后,InnoDB 是 MySQL 的默認存儲引擎。

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

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

          你也可以通過 show variables like '%storage_engine%' 命令直接查看 MySQL 當前默認的存儲引擎。

          查看 MySQL 當前默認的存儲引擎

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

          查看表的存儲引擎

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

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

          MySQL 存儲引擎架構了解嗎?

          MySQL 存儲引擎采用的是插件式架構,支持多種存儲引擎,我們甚至可以為不同的數據庫表設置不同的存儲引擎以適應不同場景的需要。存儲引擎是基于表的,而不是數據庫。

          并且,你還可以根據 MySQL 定義的存儲引擎實現標準接口來編寫一個屬于自己的存儲引擎。這些非官方提供的存儲引擎可以稱為第三方存儲引擎,區別于官方存儲引擎。像目前最常用的 InnoDB 其實剛開始就是一個第三方存儲引擎,后面由于過于優秀,其被 Oracle 直接收購了。

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

          MyISAM 和 InnoDB 的區別是什么?

          MySQL 5.5 之前,MyISAM 引擎是 MySQL 的默認存儲引擎,可謂是風光一時。

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

          MySQL 5.5.5 之前,MyISAM 是 MySQL 的默認存儲引擎。5.5.5 版本之后,InnoDB 是 MySQL 的默認存儲引擎。

          言歸正傳!咱們下面還是來簡單對比一下兩者:

          1.是否支持行級鎖

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

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

          2.是否支持事務

          MyISAM 不提供事務支持。

          InnoDB 提供事務支持,實現了 SQL 標準定義了四個隔離級別,具有提交(commit)和回滾(rollback)事務的能力。并且,InnoDB 默認使用的 REPEATABLE-READ(可重讀)隔離級別是可以解決幻讀問題發生的(基于 MVCC 和 Next-Key Lock)。

          關于 MySQL 事務的詳細介紹,可以看看我寫的這篇文章:MySQL 事務隔離級別詳解[1]

          3.是否支持外鍵

          MyISAM 不支持,而 InnoDB 支持。

          外鍵對于維護數據一致性非常有幫助,但是對性能有一定的損耗。因此,通常情況下,我們是不建議在實際生產項目中使用外鍵的,在業務代碼中進行約束即可!

          阿里的《Java 開發手冊》也是明確規定禁止使用外鍵的。

          不過,在代碼中進行約束的話,對程序員的能力要求更高,具體是否要采用外鍵還是要根據你的項目實際情況而定。

          總結:一般我們也是不建議在數據庫層面使用外鍵的,應用層面可以解決。不過,這樣會對數據的一致性造成威脅。具體要不要使用外鍵還是要根據你的項目來決定。

          4.是否支持數據庫異常崩潰后的安全恢復

          MyISAM 不支持,而 InnoDB 支持。

          使用 InnoDB 的數據庫在異常崩潰后,數據庫重新啟動的時候會保證數據庫恢復到崩潰前的狀態。這個恢復的過程依賴于 redo log

          5.是否支持 MVCC

          MyISAM 不支持,而 InnoDB 支持。

          講真,這個對比有點廢話,畢竟 MyISAM 連行級鎖都不支持。MVCC 可以看作是行級鎖的一個升級,可以有效減少加鎖操作,提高性能。

          6.索引實現不一樣。

          雖然 MyISAM 引擎和 InnoDB 引擎都是使用 B+Tree 作為索引結構,但是兩者的實現方式不太一樣。

          InnoDB 引擎中,其數據文件本身就是索引文件。相比 MyISAM,索引文件和數據文件是分離的,其表數據文件本身就是按 B+Tree 組織的一個索引結構,樹的葉節點 data 域保存了完整的數據記錄。

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

          MyISAM 和 InnoDB 如何選擇?

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

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

          不要輕易相信“MyISAM 比 InnoDB 快”之類的經驗之談,這個結論往往不是絕對的。在很多我們已知場景中,InnoDB 的速度都可以讓 MyISAM 望塵莫及,尤其是用到了聚簇索引,或者需要訪問的數據都可以放入內存的應用。

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

          因此,對于咱們日常開發的業務系統來說,你幾乎找不到什么理由再使用 MyISAM 作為自己的 MySQL 數據庫的存儲引擎。

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

          正文開始~

          總體情況

          h5之前,存儲主要是用cookies。cookies缺點有在請求頭上帶著數據,大小是4k之內。主Domain污染。

          主要應用:購物車、客戶登錄

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

          目標

          1. 解決4k的大小問題
          2. 解決請求頭常帶存儲信息的問題
          3. 解決關系型存儲的問題
          4. 跨瀏覽器

          1.本地存儲localstorage

          存儲方式:

          以鍵值對(Key-Value)的方式存儲,永久存儲,永不失效,除非手動刪除。

          大小:

          每個域名5M

          支持情況:

          注意:IE9 localStorage不支持本地文件,需要將項目署到服務器,才可以支持!

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

          常用的API:

          getItem //取記錄

          setIten//設置記錄

          removeItem//移除記錄

          key//取key所對應的值

          clear//清除記錄

          存儲的內容:

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

          2.本地存儲sessionstorage

          HTML5 的本地存儲 API 中的 localStorage 與 sessionStorage 在使用方法上是相同的,區別在于 sessionStorage 在關閉頁面后即被清空,而 localStorage 則會一直保存。

          3.離線緩存(application cache)

          本地緩存應用所需的文件

          使用方法:

          ①配置manifest文件

          頁面上:

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

          Manifest 文件:

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

          manifest 文件可分為三個部分:

          ①CACHE MANIFEST - 在此標題下列出的文件將在首次下載后進行緩存

          ②NETWORK - 在此標題下列出的文件需要與服務器的連接,且不會被緩存

          ③FALLBACK - 在此標題下列出的文件規定當頁面無法訪問時的回退頁面(比如 404 頁面)

          完整demo:

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

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

          如Tomcat:

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

          常用API:

          核心是applicationCache對象,有個status屬性,表示應用緩存的當前狀態:

          0(UNCACHED) : 無緩存, 即沒有與頁面相關的應用緩存

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

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

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

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

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

          相關的事件:

          表示應用緩存狀態的改變:

          checking : 在瀏覽器為應用緩存查找更新時觸發

          error : 在檢查更新或下載資源期間發送錯誤時觸發

          noupdate : 在檢查描述文件發現文件無變化時觸發

          downloading : 在開始下載應用緩存資源時觸發

          progress:在文件下載應用緩存的過程中持續不斷地下載地觸發

          updateready : 在頁面新的應用緩存下載完畢觸發

          cached : 在應用緩存完整可用時觸發

          Application Cache的三個優勢:

          ① 離線瀏覽

          ② 提升頁面載入速度

          ③ 降低服務器壓力

          注意事項:

          1. 瀏覽器對緩存數據的容量限制可能不太一樣(某些瀏覽器設置的限制是每個站點 5MB)

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

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

          4. 瀏覽器會自動緩存引用manifest文件的HTML文件,這就導致如果改了HTML內容,也需要更新版本才能做到更新。

          5. manifest文件中CACHE則與NETWORK,FALLBACK的位置順序沒有關系,如果是隱式聲明需要在最前面

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

          7. 更新完版本后,必須刷新一次才會啟動新版本(會出現重刷一次頁面的情況),需要添加監聽版本事件。

          8. 站點中的其他頁面即使沒有設置manifest屬性,請求的資源如果在緩存中也從緩存中訪問

          9. 當manifest文件發生改變時,資源請求本身也會觸發更新

          離線緩存與傳統瀏覽器緩存區別:

          1. 離線緩存是針對整個應用,瀏覽器緩存是單個文件

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

          3. 離線緩存可以主動通知瀏覽器更新資源

          4.Web SQL

          關系數據庫,通過SQL語句訪問

          Web SQL 數據庫 API 并不是 HTML5 規范的一部分,但是它是一個獨立的規范,引入了一組使用 SQL 操作客戶端數據庫的 APIs。

          支持情況:

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

          核心方法:

          ①openDatabase:這個方法使用現有的數據庫或者新建的數據庫創建一個數據庫對象。

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

          ③executeSql:這個方法用于執行實際的 SQL 查詢。

          打開數據庫:

          var db=openDatabase('mydb', '1.0', 'Test DB', 2 * 1024 * 1024,fn);
           
          //openDatabase() 方法對應的五個參數分別為:數據庫名稱、版本號、描述文本、數據庫大小、創建回調
          

          執行查詢操作:

          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)');
           
          }); 
          

          插入數據: 

          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")');
           
          }); 
          

          讀取數據:

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

          由這些操作可以看出,基本上都是用SQL語句進行數據庫的相關操作,如果你會MySQL的話,這個應該比較容易用。

          5.IndexedDB

          索引數據庫 (IndexedDB) API(作為 HTML5 的一部分)對創建具有豐富本地存儲數據的數據密集型的離線 HTML5 Web 應用程序很有用。同時它還有助于本地緩存數據,使傳統在線 Web 應用程序(比如移動 Web 應用程序)能夠更快地運行和響應。

          異步API:

          在IndexedDB大部分操作并不是我們常用的調用方法,返回結果的模式,而是請求——響應的模式,比如打開數據庫的操作

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

          關閉與刪除:

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

          數據存儲:

          indexedDB中沒有表的概念,而是objectStore,一個數據庫中可以包含多個objectStore,objectStore是一個靈活的數據結構,可以存放多種類型數據。也就是說一個objectStore相當于一張表,里面存儲的每條數據和一個鍵相關聯。

          我們可以使用每條記錄中的某個指定字段作為鍵值(keyPath),也可以使用自動生成的遞增數字作為鍵值(keyGenerator),也可以不指定。選擇鍵的類型不同,objectStore可以存儲的數據結構也有差異。

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

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

          1.MySQL-JavaScript 背景介紹

          MySQL 不斷進行創新,現在數據庫中包含了豐富的程序編程功能。開發人員現在可以在 MySQL 數據庫服務器中編寫 JavaScript 存儲程序(函數和過程)。這些存儲程序將通過 GraalVM 運行時間運行。該功能在 MySQL 企業版中作為預覽版提供,可通過 Oracle Technology Network (OTN) 下載。MySQL-JavaScript 還可在 OCI、AWS 和 Azure 上的 MySQL Heatwave 云服務中使用。

          1.1.為什么要使用 JavaScript 存儲程序?

          JavaScript 是最受開發人員歡迎的編程語言。除了更簡單的語法和對現代語言功能的支持外,其受歡迎的一個關鍵因素是豐富的生態系統提供了大量可重復使用的代碼模塊。

          當需要持久存儲時,最流行的開源數據庫 MySQL 將是 JavaScript 開發人員的自然選擇。通過在存儲程序中支持 JavaScript,開發人員將能用熟悉的語言編寫 MySQL 存儲程序,并利用廣泛的 JavaScript 生態系統!

          對 JavaScript 存儲程序的支持,不僅可以利用龐大的生態系統提高開發人員的工作效率,還能讓更多開發人員掌握編寫存儲程序的必要技能。換句話說,企業現在可以利用廣泛可用的 JavaScript 技能集進行后端開發,從而發掘更多的開發人才。

          存儲程序的一個關鍵優勢是最大限度地減少了數據庫服務器和應用程序之間的數據移動。出于多種原因,傳輸大量數據(尤其是批處理數據)可能會造成很多問題:

          • 這不僅耗費時間,還會造成巨大的網絡開銷。
          • 當應用程序進行頻繁交互時,延遲會明顯增加。
          • 在中間層或應用層處理大量數據需要大量內存和存儲空間,從而增加了成本。
          • 由于安全風險和數據保護要求,通常必須避免機器之間的數據傳輸,尤其是在云環境中。
          • 在數據庫服務之外移動大量數據會增加出口成本。

          使用存儲程序在數據庫內處理數據是解決這些問題的常用方法。

          1.2.有哪些新的使用場景?

          MySQL-JavaScript 為應用程序設計帶來了新的機遇,而這些機遇曾一度受限于權衡利弊。JavaScript 存儲程序使開發人員能夠避開數據移動,在數據庫內輕松無縫地實現高級數據處理邏輯。下面列出了一些簡單的用例:

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

          所提供的示例只是該功能潛力的一個縮影。還有更多復雜的用例,如部署完整的數據管道和為機器學習應用建立暫存環境。

          1.3.MySQL-JavaScript

          MySQL 正在引入對 JavaScript 存儲程序的支持。用戶現在可以在數據庫中表達豐富的程序邏輯。JavaScript 運行時通過 GraalVM 集成,用戶可以免費使用 GraalVM 的所有企業版 (EE) 功能,如編譯器優化、性能和安全功能。

          該版本支持:

          • 基于 ECMAScript 2021 的 JavaScript 語言
          • 存儲過程和存儲函數
          • MySQL 數據類型,如整數、浮點數和 CHAR/VARCHAR 類型的所有變化

          ECMAScript 標準庫包括許多基本的使用操作和數據結構,使實現變得簡單而富有表現力。開發人員還可以從在線軟件包管理器(如 "npm")中重用數百萬個可用的第三方軟件包。

          1.4.什么是 GraalVM?

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

          2.MySQL-JavaScript 應用實踐

          2.1.定義 JavaScript 存儲程序

          要在 MySQL 中創建 JavaScript 存儲程序,可以使用與傳統存儲函數和存儲過程相同的 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 可調用函數的定義中的。參數的名稱可以在 JavaScript 代碼中直接引用,當函數被調用時,SQL 類型和 JavaScript 類型之間將進行隱式類型轉換。要調用 JavaScript 存儲過程,應使用 CALL 語句,這與常規的 SQL 存儲過程類似。存儲過程支持輸入和輸出參數。

          2.2.在 SQL 語句內執行 JavaScript 代碼

          JavaScript 函數可以在任何可以調用傳統 SQL 函數的 SQL 語句中調用,如 SELECT 表達式、WHERE、GROUP BY 和 ORDER BY 子句、DML、DDL、視圖等。下面是一個調用我們在上面定義的函數的 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.調試 MySQL 中的 JavaScript 代碼

          調試與軟件開發同步進行。當 JavaScript 程序在數據庫中運行時,MySQL-JavaScript 功能會提供額外的 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 錯誤之間的轉換是透明的。除標準輸出外,開發人員還可以訪問 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 優勢

          3.1.公認的安全性

          MySQL 中的 JavaScript 支持可提供最高級別的安全性、隔離性和數據保護。MySQL 的 JavaScript 依賴于業界公認的 Oracle GraalVM 安全保證。

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

          JavaScript 存儲程序基于標準的 MySQL 權限模型。只有有權限的用戶才能創建存儲程序。對 SP 的訪問也可以通過權限來控制。一個用戶可以定義其他用戶可以執行的存儲程序。

          3.2.良好的兼容性

          JavaScript 存儲程序可與傳統的 SQL 存儲程序無縫兼容。該功能與存儲引擎無關,可以透明地從 InnoDB、Lakehouse 和 HeatWave 訪問數據。

          MySQL Heatwave 服務現在已在 OCI、AWS 和 Azure 服務部署中預裝并配置了 JavaScript。對于 MySQL 企業版,該功能需要手動安裝和配置。

          3.3.最佳的性能

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

          GraalVM 擁有自己基于 ECMAScript 2021 標準的 JavaScript 實現。該語言實現在性能方面很有競爭力,盡管它是使用 GraalVM 的 Polyglot 框架實現的,該框架側重于在同一虛擬機中支持多種編程語言。

          最后,MySQL-JavaScript 功能還得益于 GraalVM 企業版的各種先進優化技術,如編譯器優化,包括積極的內聯和部分轉義分析。這還包括一個配置文件引導的即時(JIT)編譯器,可在運行時在解釋器和本地編譯之間切換。

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

          隨著全棧開發崗位在國內外的普及,越來越多的開發者開始轉變全棧開發人員或者工程師。全棧開發在大部分情況下對前端、后端、運維工程師的工作職責進行了整合,主要包括前端、后端 和 DevOps。在 MySQL 中將引入對 JavaScript 的支持,對于前端或者全棧開發人員來說有以下好處:

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

          5.總結

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


          主站蜘蛛池模板: 日韩一本之道一区中文字幕| 日韩a无吗一区二区三区| 亚洲av午夜福利精品一区| 精品aⅴ一区二区三区| 久久精品国产免费一区| 久久99精品一区二区三区| 一区二区三区高清| 一区二区三区在线观看中文字幕 | 精品一区二区无码AV| 国产美女精品一区二区三区| 久久亚洲日韩精品一区二区三区| 九九久久99综合一区二区| 在线播放国产一区二区三区| 蜜臀AV无码一区二区三区| 日韩精品一区二区三区中文字幕 | 波多野结衣一区二区免费视频| 精品国产日韩一区三区| 在线精品动漫一区二区无广告| 精品视频一区二区三区免费| 亚洲熟妇成人精品一区| 无码人妻一区二区三区精品视频 | 无码国产伦一区二区三区视频| 久久久91精品国产一区二区三区| 午夜DV内射一区二区| 色一情一乱一伦一区二区三欧美| 亚洲精品无码一区二区| 亚洲免费一区二区| 少妇人妻精品一区二区| 中文字幕色AV一区二区三区| 无码国产精品一区二区免费I6| 日韩精品一区二区三区视频| 亚洲国产激情在线一区| 亚洲av区一区二区三| 91视频一区二区三区| 国产激情一区二区三区| 亚洲丰满熟女一区二区哦| 亚洲永久无码3D动漫一区| 国产未成女一区二区三区| 亚洲爆乳精品无码一区二区三区| 一色一伦一区二区三区| 国产午夜福利精品一区二区三区|