身為SQL Boy,基礎部分不會有人不會吧?面試也不怎麼問,基礎掌握不錯的夥伴可以跳過這部分。當然,可能會現場寫一些SQL語句,SQ語句可以透過牛客、LeetCode、LintCode之類的網站來練習。
1. 什麼是內連結、外連結、交叉連結、笛卡兒積呢?
- 內連接(inner join):取得兩張表中滿足存在連接匹配關係的記錄。
- 外部連接(outer join):不只取得兩張表中滿足存在連接匹配關係的記錄,還包括某張表(或兩張表)中不滿足匹配關係的記錄。
- 交叉連接(cross join):顯示兩張表所有記錄一一對應,沒有匹配關係進行篩選,它是笛卡爾積在SQL中的實現,如果A表有m行,B表有n行,那麼A和B交叉連接的結果就有m*n行。
- 笛卡兒積:是數學中的一個概念,例如集合A={a,b},集合B={1,2,3},那麼A✖️B={ ,,,,,,}。
2. 那MySQL 的內連接、左連接、右邊連接有什麼差別?
MySQL的連接主要分為內連接和外連接,外連接常用的有左連接、右連接。
- inner join 內連接,在兩張表進行連接查詢時,只保留兩張表中完全匹配的結果集
- left join 在兩張表進行連接查詢時,會傳回左表所有的行,即使在右表中沒有符合的記錄。
- right join 在兩張表進行連接查詢時,會傳回右表所有的行,即使在左表中沒有符合的記錄。
3.說一下資料庫的三大範式?
- 第一範式:資料表中的每一列(每個欄位)都不可以再拆分。例如用戶表,用戶地址還可以拆分成國家、省份、市,這樣才是符合第一範式的。
- 第二範式:在第一範式的基礎上,非主鍵列完全依賴主鍵,而不能是依賴主鍵的一部分。例如訂單表裡,儲存了商品資訊(商品價格、商品類型),那就需要把商品ID和訂單ID當作聯合主鍵,才滿足第二範式。
- 第三範式:在滿足第二範式的基礎上,表中的非主鍵只依賴主鍵,而不依賴其他非主鍵。例如訂單表,就不能儲存使用者資訊(姓名、地址)。
三大範式的作用是為了控制資料庫的冗餘,是對空間的節省,實際上,一般網路公司的設計都是反範式的,透過冗餘一些數據,避免跨表跨庫,利用空間換時間,提高效能。
4.varchar與char的差別?
char:
- char表示定長字串,長度是固定的;
- 如果插入資料的長度小於char的固定長度時,則用空格填充;
- 因為長度固定,所以訪問速度要比varchar快很多,甚至能快50%,但正因為其長度固定,所以會佔據多餘的空間,是空間換時間的做法;
- 對char來說,最多能存放的字元數為255,和編碼無關
varchar
:- varchar表示可變長字串,長度是可變的;
- 插入的資料是多長,就依照多長來儲存;
- varchar在存取上與char相反,它存取慢,因為長度不固定,但正因如此,不佔據多餘的空間,是時間換空間的做法;
對於varchar來說,最多能存放的字元數為65532
日常的設計,對於長度相對固定的字串,可以使用char,對於長度不確定的,使用varchar更合適一些。
5.blob和text有什麼差別?blob用於儲存二進位數據,而text用於儲存大字串。
blob沒有字元集,text有一個字元集,並且根據字元集的校對規則對值進行排序和比較- 6.DATETIME和TIMESTAMP的異同?
相同點:
###兩個資料類型儲存時間的表現格式一致。皆為 ###YYYY-MM-DD HH:MM:SS#########兩個資料型別都包含「日期」和「時間」部分。 ######兩個資料型別都可以儲存微秒的小數秒(秒後6位小數秒)############區別###:###日期範圍:DATETIME 的日期範圍是
1000-01-01 00:00:00.000000
到9999-12-31 23:59:59.999999
;TIMESTAMP 的時間範圍是1970-01-01 00:00:01.000000
UTC到``2038-01-09 03 :14:07.999999
UTC#:DATETIME 的儲存空間為8 位元組;TIMESTAMP 的儲存空間為4 位元組
時區相關:DATETIME 儲存時間與時區無關;TIMESTAMP 儲存時間與時區有關,顯示的值也依賴時區
#預設值:DATETIME 的預設值為null;TIMESTAMP 的欄位預設為空(not null),預設值為目前時間(CURRENT_TIMESTAMP)
#7. MySQL中in 和exists 的差別?
MySQL中的in語句是把外表和內表作hash 連接,而exists語句是對外表作loop循環,每次loop循環再對內表進行查詢。我們可能認為exists比in語句的效率要高,這種說法其實是不準確的,要區分情景:
如果查詢的兩個表大小相當,那麼用in和exists差異不大。
如果兩個表中一個較小,一個是大表,則子查詢表大的用exists,子查詢表小的用in。
not in 和not exists:如果查詢語句使用了not in,那麼內外表都進行全表掃描,沒有用到索引;而not extsts的子查詢依然能用到表上的索引。所以無論那個表大,用not exists都比not in快。
8.MySQL裡記錄貨幣用什麼欄位類型比較好?
貨幣在資料庫中MySQL常用Decimal和Numric類型表示,這兩種類型被MySQL實作為相同的類型。他們被用於保存與貨幣有關的數據。
例如salary DECIMAL(9,2),9(precision)代表將被用於儲存值的總的小數位數,而2(scale)代表將被用於儲存小數點後的位數。儲存在salary列中的值的範圍是從-9999999.99到99999999.99。
DECIMAL和NUMERIC值作為字串存儲,而不是作為二進制浮點數,以便保存那些值的小數精度。
之所以不使用float或double的原因:因為float和double是以二進位儲存的,所以有一定的誤差。
9.MySQL怎麼儲存emoji?
MySQL可以直接使用字串儲存emoji。
但要注意的,utf8 編碼是不行的,MySQL中的utf8是閹割版的 utf8,它最多只用 3 個位元組儲存字符,所以儲存不了表情。那該怎麼辦?
需要使用utf8mb4編碼。
alter table blogs modify content text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci not null;
10.drop、delete與truncate的差別?
三者都表示刪除,但三者有一些差異:
delete | truncate | drop | |
---|---|---|---|
類型 | 屬於DML | ##屬於DDL##屬於DDL | |
可回滾 | #無法回滾 | 不可回滾 | |
##刪除內容 | 表格結構還在,刪除表的全部或一部分資料行 | 表格結構還在,刪除表中的所有資料 | |
刪除速度 | 刪除速度慢,需要逐行刪除 | #刪除速度快 |
因此,在不再需要一張表的時候,用drop;在想刪除部分資料行時候,用delete;在保留表而刪除所有資料的時候用truncate。
11.UNION與UNION ALL的差別?
- 如果使用UNION ALL,不會合併重複的記錄行
- 效率UNION 高於UNION ALL
12.count(1)、count (*) 與count(列名) 的差別?
執行效果:
- count(*)包含了所有的列,相當於行數,在統計結果的時候,不會忽略列值為NULL
- count(1)包含了忽略所有列,用1代表程式碼行,在統計結果的時候,不會忽略列值為NULL
- #count(列名)只包含列名那一列,在統計結果的時候,會忽略列值為空(這裡的空不是只空字串或0,而是表示null)的計數,即某個字段值為NULL時,不統計。
執行速度:
- 列名為主鍵,count(列名)會比count(1)快
- #列名不為主鍵,count(1)會比count(列名)快
- 如果表多個列且沒有主鍵,則count(1) 的執行效率優於count(*)
- 如果有主鍵,則select count(主鍵)的執行效率是最優的
- 如果表只有一個字段,則select count(*)最優。
13.一條SQL查詢語句的執行順序?
FROM:對FROM子句中的左表
和右表 執行笛卡兒積(Cartesianproduct),產生虛擬表VT1 ON:對虛擬表VT1應用ON篩選,只有那些符合
的行才被插入虛擬表VT2中 JOIN:如果指定了OUTER JOIN(如LEFT OUTER JOIN、RIGHT OUTER JOIN),那麼保留表中未匹配的行作為外部行加入到虛擬表VT2中,產生虛擬表VT3。如果FROM子句包含兩個以上表,則對上一個連接產生的結果表VT3和下一個表重複執行步驟1)~步驟3),直到處理完所有的表為止
-
WHERE:對虛擬表VT3套用WHERE過濾條件,只有符合
的記錄才會被插入虛擬表VT4中 # GROUP BY:根據GROUP BY子句中的列,將VT4中的記錄進行分組操作,產生VT5
CUBE|ROLLUP:對錶VT5進行CUBE或ROLLUP操作,產生表VT6
HAVING:對虛擬表VT6應用HAVING過濾器,只有符合
的記錄才會被插入虛擬表VT7中。 SELECT:第二次執行SELECT操作,選擇指定的列,插入到虛擬表VT8中
DISTINCT:移除重複數據,產生虛擬表VT9
#ORDER BY:將虛擬表VT9中的記錄依照
進行排序操作,產生虛擬表VT10。11) LIMIT:取出指定行的記錄,產生虛擬表VT11,並傳回給查詢使用者
#資料庫架構
14.說說MySQL 的基礎架構?
MySQL邏輯架構圖主要分三層:
- 客戶端:最上層的服務並不是MySQL所獨有的,大多數基於網路的客戶端/伺服器的工具或服務都有類似的架構。例如連線處理、授權認證、安全性等等。
- Server層:大多數MySQL的核心服務功能都在這一層,包括查詢解析、分析、最佳化、快取以及所有的內建函數(例如,日期、時間、數學和加密函數),所有跨儲存引擎的功能都在這一層實現:預存程序、觸發器、視圖等。
- 儲存引擎層:第三層包含了儲存引擎。儲存引擎負責MySQL中資料的儲存和提取。 Server層透過API與儲存引擎通訊。這些介面屏蔽了不同儲存引擎之間的差異,使得這些差異對上層的查詢流程變得透明。
15.一條 SQL 查詢語句在 MySQL 中如何執行的?
- 先檢查該語句
是否有權限
,如果沒有權限,直接傳回錯誤訊息,如果有權限會先查詢快取 (MySQL8.0 版本之前)。 - 如果沒有緩存,分析器進行
語法分析
,提取 sql 語句中 select 等關鍵元素,然後判斷 sql 語句是否有語法錯誤,例如關鍵字是否正確等等。 - 語法解析之後,MySQL的伺服器會對查詢的語句進行最佳化,決定執行的方案。
- 完成查詢最佳化後,依照產生的執行計畫
呼叫資料庫引擎介面
,傳回執行結果。
儲存引擎
16.MySQL有哪些常見儲存引擎?
主要儲存引擎以及功能如下:
#功能 | MylSAM | MEMORY | InnoDB |
---|---|---|---|
。儲存限制 | 256TB | RAM | 64TB |
支援交易 | No | No | #Yes |
支援全文索引 | Yes | No | Yes |
#支援樹索引 | ##YesYes | Yes | |
No | Yes | ##Yes | |
No | N/A | #Yes | |
No | No | Yes |
隔離級別 | 髒讀 | 不可重複讀取 | 幻讀 |
---|---|---|---|
#Read Uncommited 讀取未提交 | #是 | 是 | 是 |
Read Commited 讀取已提交 | 否 | 否 | |
Repeatable Read 可重複讀取 | 否 | 否 | 是 |
52.事務的各個隔離等級都是如何實現的?
讀取未提交
讀取未提交,就不用多說了,採取的是讀不加鎖原理。
- 交易讀取不加鎖,不阻塞其他交易的讀取和寫入
- 交易寫入阻塞其他交易寫,但不阻塞其他交易讀取;
#讀取已提交&可重複讀取
讀取已提交和可重複讀取層級利用了ReadView
和MVCC
,也就是每個事務只能讀取它所能看到的版本(ReadView)。
- READ COMMITTED:每次讀取資料前都會產生一個ReadView
- REPEATABLE READ : 在第一次讀取資料時產生一個ReadView
#串行化
串行化的實現採用的是讀寫都加鎖的原理。
序列化的情況下,對於同一行事務,寫入
會加上寫入鎖定
,讀取
會加上讀鎖
。當出現讀寫鎖定衝突的時候,後存取的事務必須等前一個事務執行完成,才能繼續執行。
53.MVCC了解嗎?怎麼實現的?
MVCC(Multi Version Concurrency Control),中文名稱是多版本並發控制,簡單來說就是透過維護資料歷史版本,從而解決並發存取情況下的讀取一致性問題。關於它的實現,要抓住幾個關鍵點,隱式欄位、undo日誌、版本鏈、快照讀取&目前讀取、Read View。
版本鏈
對於InnoDB儲存引擎,每一行記錄都有兩個隱藏欄位DB_TRX_ID、DB_ROLL_PTR
-
#DB_TRX_ID
,事務ID,每次修改時,都會把該交易ID複製給DB_TRX_ID
; -
DB_ROLL_PTR
,回滾指標,指向回滾段的undo日誌。
假如有一張user
表,表中只有一行記錄,當時插入的交易id為80。此時,該筆記錄的範例圖如下:
接下來有兩個DB_TRX_ID
#分別為100
、200
的交易對這條記錄進行update
操作,整個過程如下:
由於每次變動都會先把 undo
日誌記錄下來,並用DB_ROLL_PTR
指向undo
日誌位址。因此可以認為,對該筆記錄的修改日誌串連起來就形成了一個版本鏈
,版本鏈的頭節點就是目前記錄最新的值。如下:
ReadView
#對於
Read Committed
與Repeatable Read
隔離等級來說,都需要讀取已經提交的事務所修改的記錄,也就是說如果版本鏈中某個版本的修改沒有提交,那麼該版本的記錄時不能被讀取的。所以需要確定在Read Committed
和Repeatable Read
隔離等級下,版本鏈中哪個版本是能被目前交易讀取的。於是就引入了ReadView
這個概念來解決這個問題。
Read View就是交易執行快照讀取時,產生的讀取視圖,相當於某時刻表記錄的一個快照,透過這個快照,我們可以取得:
- m_ids :表示在產生ReadView 時目前系統中活躍的讀寫事務的交易id 清單。
- min_trx_id :表示在產生 ReadView 時目前系統中活躍的讀寫事務中最小的 事務id ,也就是 m_ids 中的最小值。
- max_trx_id :表示產生 ReadView 時系統中應該指派給下一個交易的 id 值。
- creator_trx_id :表示產生該ReadView 的事務的事務id
有了這個ReadView ,這樣在存取某筆記錄時,只需要按照下邊的步驟判斷記錄的某個版本是否可見:
- 如果被存取版本的 DB_TRX_ID 屬性值與 ReadView 中的 creator_trx_id 值相同,表示目前事務在存取它自己修改過的記錄,所以該版本可以被目前事務存取。
- 如果被存取版本的 DB_TRX_ID 屬性值小於 ReadView 中的 min_trx_id 值,表示產生該版本的事務在目前事務產生 ReadView 前已經提交,所以該版本可以被目前事務存取。
- 如果被存取版本的 DB_TRX_ID 屬性值大於 ReadView 中的 max_trx_id 值,表示產生該版本的事務在目前事務產生 ReadView 後才開啟,所以該版本不可以被目前事務存取。
- 如果被存取版本的DB_TRX_ID 屬性值在ReadView 的min_trx_id 和max_trx_id 之間,那就需要判斷一下trx_id 屬性值是不是在m_ids 清單中,如果在,說明建立ReadView 時產生該版本的事務還是活躍的,該版本不可以被存取;如果不在,說明創建ReadView 時產生該版本的事務已經被提交,該版本可以被存取。
如果某個版本的數據對當前事務不可見的話,那就順著版本鏈找到下一個版本的數據,繼續按照上邊的步驟判斷可見性,依此類推,直到版本鏈中的最後一個版本。如果最後一個版本也不可見的話,那麼就表示該筆記錄對該交易完全不可見,查詢結果就不包含該記錄。
在 MySQL 中, READ COMMITTED 和 REPEATABLE READ 隔離等級的一個非常大的差異就是它們產生ReadView的時機不同。
READ COMMITTED 是每次讀取資料前都會產生一個ReadView,這樣就能保證自己每次都能讀到其它事務提交的資料;REPEATABLE READ 是在第一次讀取資料時產生一個ReadView,這樣就能確保後續讀取的結果完全一致。
高可用/效能
54.資料庫讀寫分離了解嗎?
讀寫分離的基本原理是將資料庫讀寫操作分散到不同的節點上,以下是基本架構圖:
- 資料庫伺服器搭建主從集群,一主一從、一主多從都可以。
- 資料庫主機負責讀寫操作,從機只負責讀取操作。
- 資料庫主機透過複製將資料同步到從機,每台資料庫伺服器都儲存了所有的業務資料。
- 業務伺服器將寫入作業發給資料庫主機,並將讀取操作傳送給資料庫從機。
1、程式碼封裝
程式碼封裝指在程式碼中抽象化一個資料存取層(所以有的文章也稱這種方式為"中間層封裝" ) ,實現讀寫操作分離與資料庫伺服器連線的管理。例如,基於Hibernate 進行簡單封裝,就可以實現讀寫分離:2、中間件封裝
中間件封裝指的是獨立一套系統出來,實現讀寫操作分離和資料庫伺服器連接的管理。中間件提供業務伺服器 SQL 相容的協議,業務伺服器無須自行進行讀寫分離。 對於業務伺服器來說,存取中間件和存取資料庫沒有區別,事實上在業務伺服器看來,中間件就是一個資料庫伺服器。 其基本架構是:- master資料寫入,更新binlog
- master建立一個dump線程向slave推送binlog
- slave連接到master的時候,會建立一個IO線程接收binlog,並記錄到relay log中繼日誌中
- slave再開啟一個sql線程讀取relay log事件並在slave執行,完成同步
- slave記錄自己的binglog
主從同步延遲的原因
一個伺服器開放N個連結給客戶端來連接的,這樣有會有大並發的更新操作, 但是從伺服器的里面讀取binlog 的線程僅有一個,當某個SQL 在從伺服器上執行的時間稍長或由於某個SQL 要進行鎖定表就會導致,主伺服器的SQL 大量積壓,並未同步到從伺服器。這就導致了主從不一致, 也就是主從延遲。
主從同步延遲的解決方案
解決主從複製延遲有幾種常見的方法:
寫操作後的讀取操作指定發給資料庫主伺服器
例如,註冊帳號完成後,登入時讀取帳號的讀取操作也會發給資料庫主伺服器。這種方式和業務強綁定,對業務的侵入和影響較大,如果哪個新來的程式設計師不知道這樣寫程式碼,就會導致一個bug。
讀取從機失敗後再讀一次主機
#這就是通常所說的"二次讀取" ,二次讀取和業務無綁定,只需要對底層資料庫存取的API 進行封裝即可,實現代價較小,不足之處在於如果有很多二次讀取,將大大增加主機的讀取操作壓力。例如,駭客暴力破解帳號,會導致大量的二次讀取操作,主機可能頂不住讀操作的壓力而崩潰。
關鍵業務讀寫操作全部指向主機,非關鍵業務採用讀寫分離
#例如,對於一個使用者管理系統來說,註冊登入的業務讀寫操作全部存取主機,使用者的介紹、爰好、等級等業務,可以採用讀寫分離,因為即使使用者改了自己的自我介紹,在查詢時卻看到了自我介紹還是舊的,業務影響與不能登入相比就小很多,還可以忍受。
58.你們通常是怎麼分庫的呢?
- 垂直分庫:以表為依據,依業務歸屬不同,將不同的表拆分到不同的庫中。
- 水平分庫:以欄位為依據,依照某一策略(hash、range 等),將一個庫中的資料拆分到多個個庫中。
59.那你們是怎麼分錶的?
- 水平分錶:以欄位為依據,依照某一策略(hash、range 等),將一個表格中的資料拆分到多個表格中。
- 垂直分錶:以欄位為依據,依照欄位的活躍性,將表格中欄位拆到不同的表(主表和擴充表)。
60.水平分錶有哪幾種路由方式?
什麼是路由呢?就是數據應該分到哪一張表。
水平分錶主要有三種路由方式:
- 範圍路由:選取有序的資料列(例如,整形、時間戳記等) 作為路由的條件,不同分段分散到不同的資料庫表。
我們可以觀察一些支付系統,發現只能查一年範圍內的支付記錄,這可能就是支付公司按照時間進行了分錶。
範圍路由設計的複雜點主要體現在分段大小的選取上,分段太小會導致切分後子表數量過多,增加維護複雜度;分段太大可能會導致單表仍存在效能問題,一般建議分段大小在100 萬至2000 萬之間,具體需要根據業務選取適當的分段大小。
範圍路由的優點是可以隨著資料的增加平滑地擴充新的表。例如,現在的用戶是 100 萬,如果增加到 1000 萬,只需要增加新的表就可以了,原有的數據不需要動。範圍路由的一個比較隱含的缺點是分佈不均勻,假如按照1000 萬來進行分錶,有可能某個分段實際儲存的資料量只有1000 條,而另外一個分段實際儲存的資料量有900萬條。
- Hash 路由:選取某個欄位 (或某幾個欄位組合也可以) 的值進行 Hash 運算,然後根據 Hash 結果分散到不同的資料庫表中。
同樣以訂單id 為例,假如我們一開始就規劃了4個資料庫表,路由演算法可以簡單地用id % 4 的值來表示資料所屬的資料庫表編號,id 為12的訂單放到編號50的子表中,id為13的訂單放到編號61的字表中。
Hash 路由設計的複雜點主要體現在初始表數量的選取上,表數量太多維護比較麻煩,表數量太少又可能導致單表效能有問題。而用了 Hash 路由後,增加子表數量是非常麻煩的,所有資料都要重分佈。 Hash 路由的優缺點和範圍路由基本上相反,Hash 路由的優點是表分佈比較均勻,缺點是擴充新的表很麻煩,所有資料都要重分佈。
- 設定路由:設定路由就是路由表,用一張獨立的表來記錄路由資訊。同樣以訂單id 為例,我們新增一張 order_router 表,這個表包含 orderjd 和 tablejd 兩個欄位 , 根據 orderjd 就可以查詢對應的 table_id。
設定路由設計簡單,使用起來非常靈活,尤其是在擴充表的時候,只需要遷移指定的數據,然後修改路由表就可以了。
配置路由的缺點就是必須多查詢一次,會影響整體效能;而且路由表本身如果太大(例如,數億個資料) ,效能同樣可能成為瓶頸,如果我們再次將路由表分庫分錶,又面臨一個死循環式的路由演算法選擇問題。
61.不停機擴容怎麼實現?
實際上,不停機擴容,實操起來是個非常麻煩而且很有風險的操作,當然,面試回答起來就簡單很多。
-
第一階段:線上雙寫,查詢走舊庫
#建立好新的庫表結構,資料寫入久庫的同時,也寫入拆分的新庫
-
資料遷移,使用資料遷移程序,將舊庫中的歷史資料遷移到新庫
使用定時任務,新舊函式庫的資料對比,把差異補齊
-
第二階段:線上雙寫,查詢走新函式庫
#完成了歷史資料的同步與校驗
#把對資料的讀取切換到新函式庫
- 經過一段時間,確定舊庫沒有請求之後,就可以下線舊庫
- #62.常用的分庫分錶中間件有哪些?
- #63.那你覺得分庫分錶會帶來什麼問題呢?
- 從分庫的角度來講:
交易的問題
使用關係型資料庫,有很大一點在於它保證事務完整性。
而分庫之後單機事務就用不上了,必須使用分散式事務來解決。
跨庫JOIN 問題
在一個庫中的時候我們還可以利用JOIN 來連表查詢,而跨庫了之後就無法使用JOIN 了。
此時的解決方案就是
在業務代碼中進行關聯- ,也就是先把一個表的資料查出來,然後透過得到的結果再去查另一張表,然後利用程式碼來關聯得到最終的結果。
- 這種方式實現起來稍微比較複雜,不過也是可以接受的。 還有可以
。例如先前的表格就儲存一個關聯 ID,但業務時常要求傳回對應的 Name 或其他欄位。這時候就可以把這些欄位冗餘到目前表中,來移除需要關聯的操作。
- 還有一種方式就是
- 資料異質,透過binlog同步等方式,把需要跨庫join的資料異構到ES等儲存結構中,透過ES進行查詢。 從分錶的角度來看:
- 跨節點的count,order by,group by 以及聚合函數問題
- 只能由業務代碼來實現或用中間件將各表中的資料匯總、排序、分頁然後返回。
還是自增,只不過自增步長設定一下。例如現在有三張表,步長設定為3,三張表 ID 初始值分別是1、2、3。這樣第一張表的 ID 成長是 1、4、7。第二張表是2、5、8。第三張表是3、6、9,這樣就不會重複了。
UUID,這種最簡單,但是不連續的主鍵插入會導致嚴重的頁分裂,效能比較差。
分散式ID,比較有名的是Twitter 開源的sonwflake 雪花演算法
維運
##64.百萬級別以上的資料如何刪除? 關於索引:由於索引需要額外的維護成本,因為索引檔案是單獨存在的檔案,所以當我們對資料的增加,修改,刪除,都會產生額外的對索引檔案的操作,這些操作需要消耗額外的IO,會降低增/改/刪的執行效率。 所以,在我們刪除資料庫百萬級資料的時候,查詢MySQL官方手冊得知刪除資料的速度和建立的索引數量是成正比的。- 所以我們想要刪除百萬資料的時候可以先刪除索引
- #然後刪除其中無用資料
- #刪除完成後重新建立索引建立索引也非常快速
- 透過中間表轉換過去建立一個臨時的新表,把舊表的結構完全複製過去,添加字段,再把舊表資料複製過去,刪除舊表,新表命名為舊表的名稱,這種方式可能回丟掉一些資料。
- 用pt-online-schema-change
#pt-online-schema-change
是percona公司開發的工具,它可以在線修改表結構,它的原理也是透過中間表。
- 先在從庫加入再進行主從切換如果一張表資料量大且是熱表(讀寫特別頻繁),則可以考慮先在從庫添加,再進行主從切換,切換後再將其他幾個節點上添加字段。
mysql視頻教程】

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于架构原理的相关内容,MySQL Server架构自顶向下大致可以分网络连接层、服务层、存储引擎层和系统文件层,下面一起来看一下,希望对大家有帮助。

mysql的msi与zip版本的区别:1、zip包含的安装程序是一种主动安装,而msi包含的是被installer所用的安装文件以提交请求的方式安装;2、zip是一种数据压缩和文档存储的文件格式,msi是微软格式的安装包。

方法:1、利用right函数,语法为“update 表名 set 指定字段 = right(指定字段, length(指定字段)-1)...”;2、利用substring函数,语法为“select substring(指定字段,2)..”。

在mysql中,可以利用char()和REPLACE()函数来替换换行符;REPLACE()函数可以用新字符串替换列中的换行符,而换行符可使用“char(13)”来表示,语法为“replace(字段名,char(13),'新字符串') ”。

转换方法:1、利用cast函数,语法“select * from 表名 order by cast(字段名 as SIGNED)”;2、利用“select * from 表名 order by CONVERT(字段名,SIGNED)”语句。

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于MySQL复制技术的相关问题,包括了异步复制、半同步复制等等内容,下面一起来看一下,希望对大家有帮助。

在mysql中,可以利用REGEXP运算符判断数据是否是数字类型,语法为“String REGEXP '[^0-9.]'”;该运算符是正则表达式的缩写,若数据字符中含有数字时,返回的结果是true,反之返回的结果是false。

在mysql中,可利用“ALTER TABLE 表名 DROP INDEX unique key名”语句来删除unique key;ALTER TABLE语句用于对数据进行添加、删除或修改操作,DROP INDEX语句用于表示删除约束操作。

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Dreamweaver CS6
視覺化網頁開發工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

記事本++7.3.1
好用且免費的程式碼編輯器

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中