mysql分庫分表方案
問題:什麼是最好的切分mysql表的方式?我想到的有:
應用層切分?
mysql**層切分?
提供中心查詢分片服務?
你們知道任何這方面有趣的專案或者工具嗎?
回答:最好的切分mysql的方式就是:除非萬不得已,不要去幹它。
當你寫乙個應用的時候,你通常都想要最快的開發速度。 只有當需要時,你才開始優化延時,提高吞吐量,
你切分資料庫的原因無非因為資料庫的讀或者寫: 資料庫寫:寫操作永久的超過了伺服器的磁碟負載;太多寫入導致副本同步永遠的落後了。 資料庫讀:讀取到的資料量太大以至於稱爆記憶體;並且大多數讀操作開始直擊磁碟而不是從記憶體中讀取資料。
只有這時,你才需要做資料庫切分。
當你開始切分後,你開始以以下幾種方式支付代價:
你的sql語句不再是宣告式的(declarative)
一般的,你用sql語句告訴資料庫你要什麼資料,然後讓優化器優化sql並轉化成資料獲取程式。 這很棒,因為它非常靈活,而且寫這些轉化程式很無聊,嚴重影響開發速度。
分布式環境下,你將a節點的表和b節點的表進行join,甚至有些表的資料大到超過乙個節點, 在a節點和b節點將資料join起來,然後和b節點和c節點join的資料聚合。 你開始寫單方面的hash應用程式來解決這個問題(或者你可以再造mysql的集群), 這表示結果你得到一大堆的非宣告式的sql,而且讓它以一種面向過程的方式工作。
你招致了大量的網路延時
一般的,一條sql查詢語句可以本地解決並且優化器知道在本地磁碟的消耗時間, 可以最小的消耗解決這個查詢問題。
在分布式環境下,查詢語句必須要通過kv對映,訪問多個網路節點(希望是批量訪問, 而不是每個key一次往返),或者將where條件放在他們將被執行的節點上。
但是即使在最好的情況下,涉及到許多網路往返都會更加複雜。特別是mysql的優化器完全 不知道網路延時的情況。
你時區了sql的許多強大能力
好吧,這或許沒那麼重要,但是外檢約束,其他保證資料完整性的sql機制,對於跨多個節點 是無能為力的。
mysql沒有api保證非同步查詢順序工作
當相同型別的資料存放在多個節點上(比如使用者資料存放在a,b,c節點上),水平查詢 需要訪問所有節點,資料訪問時間直接因以節點數線性增長。除非多個節點是已並行方式 訪問,然後在以map-reduce的方式聚合。
前提是需要非同步通訊的api,單這並不存在於mysql很好的工作態。可選的方案是 在子程序中增加很多的forking和連線,
總結當你開始切分,資料結構和網路拓撲明顯影響到應用的效能。為了執行良好,你的應用 需要當心這些事情,這表明只有應用層的切分才有意義。
如果需要自動切分,問題會更多(比如決定那個節點的那個列作為hash主鍵),或者 你想要手動進行切分,xyz使用者去這個主庫上,abc去和def去到那個主庫上。
業務功能上的切分有些好處,如果做對了,這對絕大部分開發人員是透明的。因為所有相關 的表都存放在本地。折讓透明從宣告式的sql中盡量受益,並且有更少的網路延時,因為 跨節點的網路訪問被保持到最小化。
業務功能上的切分的缺點是,它不能准許單個表的資料膨脹過大,這需要設計者的主動注意。
業務功能切分的好處是,針對乙個並沒有太多改變的**庫,它相對而言非常簡單。 booking.com在過去幾年進行過幾次,並且能很好的工作。
mysql建表語句
在sql語句中注意 約束的概念 1.實體完整性約束 主鍵 唯一且非空 primary key 違約處理 no action 拒絕執行 2.參照完整性約束 外來鍵約束 foregin key references tablename filedname on delete update casecad...
mysql建表語句
mysql裝好以後,進入命令列,開始建表需要先建立乙個database.開始使用 create database mybase use mybase create table user id int 10 auto increment not null primary key,username va...
mysql建表語句
工作的時候總會寫一些建表語句提交給db,有的時候就會忘記主鍵自增寫法,以及一些型別的標註,下面是乙個比較全的建表語句,包括各種型別。create table minisite lock site id int not null auto increment primary key,admin id ...