目錄
關係表的不靈活性
JOIN聯合查詢
分支的混亂
儲存引擎混亂
原生 JSON 支援的缺乏
封閉來源和專有模組的興起
首頁 資料庫 mysql教程 8 個不得不說的 MySQL 陷阱

8 個不得不說的 MySQL 陷阱

Feb 22, 2017 am 11:07 AM

Mysql安裝簡單,速度較快,功能豐富。另外它還是開源運動的標桿,它的偉大成就向我們展示了一個成功的公司是可以建立在開源程式碼之上的。

然而用過mysql的人都曾對著顯示器揮舞過拳頭。但你不可能發明一種每秒能保存成千上萬行網路數據,並且一點錯誤都沒有的技術吧。

為了在這個夏天躁起來,我們列舉了8個抱怨開源關係型資料庫的理由。以下列舉的理由中不僅限於 MySQL,有些是針對關係型資料庫的。如果我們沒有理清楚關係型資料庫和 MySQL,我們將會永遠陷入90年代的思想。我們需要推倒然後重建這些。或者我們轉向使用一個最近流行的,存在時間沒有長到可以列出一堆像下面一樣的理由的資料庫。

根深蒂固的bugs

任何大的軟體包都有 bug。但稍微深入了解一下,就會發現和 Mysql 相關的 bugs 自成系統。突然你需要留心,因為 NULL 並不是以同樣的方式出現,外鍵約束也沒有像你想像的那樣執行,連主鍵自動增長也會出錯。

小問題大量存在,而且並不總是可以修復,這就是為什麼有些人保持一個清單。還好 MySQL 維護著一個非常好的 bug 報告系統,讓我們可以知道我一些我們無法想像的事情,知道其他人也正在經歷同樣的磨難。

關係表的不靈活性

關係表具有條理性,條理性是好的-但是,它使得程式設計師必須編造或硬塞一些資料到已經定義好模式的列中。 NoSQL開始越來越受到歡迎的原因之一,就是它為程式設計師提供了足夠的彈性,來加速資料庫的使用。如果一個街道地址需要增加一行,那麼,你可以將它輕鬆地插入到一個NoSQL文件中。如果你想新增一個完整的新的資料區塊,無論它包含什麼內容,文件模型也可以原封不動地接受你的數據,而不必改為它要求的資料格式。

試想一下,你用整數格式建立了一個全部是郵編的表格。這個表是十分有效率的,它執行的規則也很好。突然一次,有人上傳了一個使用了連字符的九位數郵編。或者還有可能,你得到了一位來自加拿大客戶的信件,上面寫有郵遞區號。

這時,一切都亂了。老闆要求網站要在幾小時內恢復正常運作。然而,現在已經沒有時間來重建資料庫。程式設計師可以做什麼?或許,可以使用駭客手段把加拿大郵遞區號由base64的數位格式改為base 10格式?或是設定一個使用轉義編碼的輔助表格,用來說明真正的郵遞區號或其他?誰知道呢?到處都有駭客,他們都是危險的。但你沒有時間搞定它。

MySQL的關聯規則讓每個人都誠實謹慎,但它能強制我們避免易受攻擊和欺騙的麻煩。

JOIN聯合查詢

曾幾何時,將資料分錶保存是電腦科學史上的偉大創新。分開後的表格不僅結構簡單,也簡化了使用。但它卻需要使用join語句來查詢。

sql透過一系列join建構的複雜查詢將開發者推入了困惑與絕望的深淵。而且儲存引擎也需要以最優的方式來有效率地解析join語句。開發者需要絞盡腦汁編寫查詢語句,然後資料庫對其進行解析。

這就是許多注重運行速度的開發者放棄資料分錶轉而使用不規範資料表的原因。不區分資料實體,將所有資料保存到一個大表中—以避免複雜的查詢。這樣確實很快,而且伺服器也不會耗盡記憶體。

磁碟空間現在很廉價。 8TB的磁碟已經在售,更大的也要上市了。我們不再需要為使用join而絞盡腦汁了。

分支的混亂

是的,一個可靠的、得到良好支援的MySQL分支,可以帶來競爭和選擇,但它也造成困惑和混亂。更糟的是,一個稱為MariaDB的MySQL分支,由Monty Widenius維護著。他同樣也在參與編寫MySQL。那麼,MariaDB才是真正獨立的值得我們擁護的嗎?還是它是MySQL?我們是否應該堅持使用由創建原始MySQL資料庫的組織運營的核心程式碼?或者我們應該加入那些被認為更聰明的,往往很酷的背叛者?

還有,我們該如何獲得關於相容性的資訊?一方面,我們被確信MariaDB和MySQL十分相似。另一方面,我們要相信有差異──不然為什麼大家都在爭論它?也許它們在性能和我們查詢的範圍內,在兩個陣營中工作方式相同?但也許他們不同-或將來會不同。

儲存引擎混亂

MySQL不是事實上的相同的資料庫;它由幾個資料庫組成,它們的大多數細節都被統一的表面所掩蓋。在開始的時候,有一個MyISAM引擎,它很快但在前後一致上不能做到完備。有時候你需要速度並且可以接受不一致的結果時是很好的。

當人們需要更多時,具備完整事務支援的InnoDB出現了。但這還不夠。現在,它可能有20種儲存引擎的選擇——這足以使一個資料庫管理員瘋狂。當然,有些時候在不同的儲存引擎之間切換而不必重寫你的SQL是很好的,但是切換後總是會帶來混亂。這個表格我選擇的引擎是 MyISAM 還是 innoDB 呢?或者,我決定輸出的資料是CSV格式的嗎?

獲利的動機

雖然MySQL 是一款成功的開源產品,但它仍然是一門生意,裡面滿是靠它獲得薪水的專業開發者。當大多數用戶持續享受開源許可證帶來的最佳體驗時,毫無疑問這家公司還在為賺取足夠的錢來維持營運而努力。這導致自由代碼在「社群版」和出售給企業的完整產品之間產生了奇怪的分岐。

你該付錢嗎?你在這裡賺了多少錢?在社群版之上開展經營行為是否公平?企業版中額外的功能,是否只是一個噱頭來引誘我們不斷付費呢?這至少說明一點,它是另一組需要回答的問題。選用哪個版本?遵照哪種許可證?選用它的哪個功能集?

原生 JSON 支援的缺乏

看 MySQL 的年齡最好的方法是安裝它,然後你會意識到需要添加更多的驅動程式使它可用。 MySQL 通常在 3306 連接埠上通信,它一般輸出的是它自己難以理解的格式化資料。如果你想讓你的程式碼和它通信,你必須加入另一層的程式碼,將 MySQL 的語言轉換成有用的東西。這些層的程式碼,以庫的形式分發,經常需要人們購買一個商業的許可證。

現代資料儲存層通常直接以 JSON 通訊。雖然 MySQL 和 MariaDB 現在有能力解析 SQL 中的 JSON 部分,但這還遠遠不夠好,原生的 JSON 介面已經在 CouchDB,MongoDB,或任何最新的工具中廣泛使用。

封閉來源和專有模組的興起

我說過 MySQL 是開源的嗎?它是,但除了一些在」開源核心「週邊開發的一些較新的、非開源的程式碼、專有模組。程式設計師需要吃飯,Oracle需要拿它的辛苦成果來換錢,這是商業的現實之一。它不像那些醫院,使用 MySQL 可以免費醫療照護。它不像那些農民,使用 MySQL 可以贈送食物。

要求 MySQL 永遠堅持在一個很高的標準是有點不公平的,因為開源的成功可能是個圈套。這是因為它開始可以免費,但這並不意味著它可以始終如此。如果企業需要許多新的功能,他們將不得不以這種或那種方式付費。有時向 Oracle 付費,比自己來寫程式碼便宜得多。有時商業的、不開源的程式碼是有意義的。事實不言而喻。

以上就是8 個不得不說的 MySQL 陷阱的內容,更多相關內容請關注PHP中文網(www.php.cn)!


本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1670
14
CakePHP 教程
1428
52
Laravel 教程
1329
25
PHP教程
1274
29
C# 教程
1256
24
使用 STL 函數物件需要注意哪些陷阱? 使用 STL 函數物件需要注意哪些陷阱? Apr 25, 2024 pm 02:42 PM

STL函數物件使用陷阱:不可修改函數物件的狀態,否則可能導致後果或崩潰。函數物件應作為右值使用,左值使用會導致未定義行為。捕獲局部變量時應確保捕獲所有引用的變量,否則可能導致崩潰。

C++ 遞歸的陷阱和解決方案:常見錯誤規避指南 C++ 遞歸的陷阱和解決方案:常見錯誤規避指南 May 02, 2024 am 10:54 AM

避免無界遞歸:設定遞迴基線,明確停止條件。最佳化遞歸效率:考慮使用循環或迭代代替深度遞歸呼叫。預防堆疊溢位:控制遞歸深度,利用最佳化技術或輔助資料結構。禁止修改傳入參數:傳遞值副本或使用全域變數儲存遞歸結果。實戰範例:透過最佳化fibonacci()函數闡述最佳實踐應用。

PHP CI/CD 的陷阱:常見問題及解決方法 PHP CI/CD 的陷阱:常見問題及解決方法 Mar 05, 2024 pm 10:10 PM

PHP持续集成和持续交付(CI/CD)的实施对于现代WEB开发至关重要,可以显著提高软件开发和部署的效率和质量。然而,在这一过程中也存在一些常见的陷阱,如果不及时解决,可能会阻碍团队实现CI/CD流程的全部好处。本文着重介绍这些陷阱并提供实用的解决方法,从而为phpCI/CD管道建立一个稳固的基础。1.脚本维护不善在CI/CD管道中,自动化脚本是执行任务和验证构建的基石。然而,如果没有适当的维护,这些脚本可能会变得陈旧或失效。解决方法:将脚本保存在版本控制系统中,例如git。定期回顾和更新脚本,

Java框架:常見的陷阱和如何避開它們 Java框架:常見的陷阱和如何避開它們 Jun 04, 2024 am 10:54 AM

使用Java框架時常見的陷阱包括:過度依賴框架:避免過度依賴框架,保留程式碼的彈性。與特定版本綁定:使用穩定且支援的框架版本,遵循官方升級指南。配置不足:仔細配置框架以滿足特定需求,使用效能分析工具確保最佳配置。不當單元測試:全面單元測試依賴框架的程式碼,使用模擬框架攔截方法呼叫。忽略安全考慮:考慮框架的安全性交互,使用安全框架,啟用安全功能,定期掃描漏洞。

C++語法中的陷阱與解決方案 C++語法中的陷阱與解決方案 Jun 03, 2024 pm 04:22 PM

C++語法中的陷阱與解決方案C++是一門強大的程式語言,但它的語法也讓程式設計師很容易陷入陷阱。本文將討論C++語法中的一些常見陷阱,並提供避免或解決它們的解決方案。陷阱1:誤用引用問題:將一個指標錯誤地用作引用。程式碼範例:int&ref=*ptr;//錯誤:ptr是指針,不能解引用為引用解決方案:使用指針指針或將指針解引用為非引用型別。 int*ptr2=&*ptr;//使用指標指標intval=*ptr;//解引用為非引用型別陷阱2:條件語句中的預設行為問

Java框架中的陷阱:辨識並避免它們的指南 Java框架中的陷阱:辨識並避免它們的指南 Jun 04, 2024 pm 12:23 PM

Java框架的使用陷阱可阻礙應用程式的效能、可維護性和安全性。這些陷阱包括:過度使用框架:避免不必要地依賴框架,使用簡單的工廠模式或依賴項注入來取代。忽略框架約束:遵守框架文件中的約束和最佳實踐,避免違規導致錯誤。缺乏自訂:使用擴充點和回呼機制自訂框架的特定部分,滿足特定需求。效能問題:了解框架的效能影響,並使用剖析工具識別和解決瓶頸。

Golang協程的常見錯誤與陷阱 Golang協程的常見錯誤與陷阱 Apr 15, 2024 pm 06:09 PM

Go協程中的常見錯誤包括:協程洩漏:未正確釋放資源導致記憶體消耗過多;解決方法:使用defer語句。死鎖:多個協程循環等待;解決方法:避免循環等待模式,使用channel或sync.Mutex協調存取。資料競爭:共享資料同時被多個協程存取;解決方法:使用sync.Mutex或sync.WaitGroup保護共享資料。計時器取消:協程取消後計時器未正確取消;解決方法:使用context.Context傳播取消訊號。

Golang函數指標的陷阱和最佳實踐 Golang函數指標的陷阱和最佳實踐 Apr 15, 2024 pm 05:36 PM

Go中的函數指標陷阱和最佳實踐:陷阱:指標指向不可用函數最佳實踐:使用局部變數或閉包捕獲函數值。陷阱:修改指標所指向的函數最佳實務:保持函數指標不可修改,在另一個閉包中建立新的函數。實戰案例:回呼函數例如,使用函數指標建立日誌函數,該函數將日誌訊息和嚴重等級作為回調函數的參數。

See all articles