後端接口訪問數據查詢如何提高性能?從MySQL、ES、HBASE等技術出發...

2020-12-24 素文宅博客

1. MySQL查詢慢是什麼體驗?

謝邀,利益相關。

大多數網際網路應用場景都是讀多寫少,業務邏輯更多分布在寫上。對讀的要求大概就是要快。那麼都有什麼原因會導致我們完成一次出色的慢查詢呢?

1.1 索引

在數據量不是很大時,大多慢查詢可以用索引解決,大多慢查詢也因為索引不合理而產生。

MySQL 索引基於 B+ 樹,這句話相信面試都背爛了,接著就可以問最左前綴索引、 B+ 樹和各種樹了。

說到最左前綴,實際就是組合索引的使用規則,使用合理組合索引可以有效的提高查詢速度,為什麼呢?

因為索引下推。如果查詢條件包含在了組合索引中,比如存在組合索引(a,b),查詢到滿足 a 的記錄後會直接在索引內部判斷 b 是否滿足,減少回表次數。同時,如果查詢的列恰好包含在組合索引中,即為覆蓋索引,無需回表。索引規則估計都知道,實際開發中也會創建和使用。問題可能更多的是:為什麼建了索引還慢?

1.1.1 什麼原因導致索引失效

建了索引還慢,多半是索引失效(未使用),可用 explain 分析。索引失效常見原因有 :

where 中使用 != 或 <> 或 or 或表達式或函數(左側)like 語句 % 開頭字符串未加』』索引欄位區分度過低,如性別未匹配最左前綴(一張嘴就知道老面試題了) 為什麼這些做法會導致失效,成熟的 MySQL 也有自己的想法。

1.1.2 這些原因為什麼導致索引失效

如果要 MySQL 給一個理由,還是那棵 B+ 樹。

函數操作

當在 查詢 where = 左側使用表達式或函數時,如欄位 A 為字符串型且有索引, 有 where length(a) = 6查詢,這時傳遞一個 6 到 A 的索引樹,不難想像在樹的第一層就迷路了。

隱式轉換

隱式類型轉換和隱式字符編碼轉換也會導致這個問題。

隱式類型轉換對於 JOOQ 這種框架來說一般倒不會出現。隱式字符編碼轉換在連表查詢時倒可能出現,即連表欄位的類型相同但字符編碼不同。破壞了有序性

至於 Like 語句 % 開頭、字符串未加 』』 原因基本一致,MySQL 認為對索引欄位的操作可能會破壞索引有序性就機智的優化掉了。

不過,對於如性別這種區分度過低的欄位,索引失效就不是因為這個原因。

1.1.3 性別欄位為什麼不要加索引

為什麼索引區分度低的欄位不要加索引。盲猜效率低,效率的確低,有時甚至會等於沒加。

對於非聚簇索引,是要回表的。假如有 100 條數據,在 sex 欄位建立索引,掃描到 51 個 male,需要再回表掃描 51 行。還不如直接來一次全表掃描呢。

所以,InnoDB 引擎對於這種場景就會放棄使用索引,至於區分度多低多少會放棄,大致是某類型的數據佔到總的 30% 左右時,就會放棄使用該欄位的索引,有興趣可以試一下。

1.1.4 有什麼好用且簡單的索引方法

前面說到大多慢查詢都源於索引,怎麼建立並用好索引。這裡有一些簡單的規則。

索引下推:性別欄位不適合建索引,但確實存在查詢場景怎麼辦?如果是多條件查詢,可以建立聯合索引利用該特性優化。覆蓋索引:也是聯合索引,查詢需要的信息在索引裡已經包含了,就不會再回表了。前綴索引:對於字符串,可以只在前 N 位添加索引,避免不必要的開支。假如的確需要如關鍵字查詢,那交給更合適的如 ES 或許更好。不要對索引欄位做函數操作對於確定的、寫多讀少的表或者頻繁更新的欄位都應該考慮索引的維護成本。1.1.5 如何評價 MySQL 選錯了索引

有時,建立了猛一看挺正確的索引,但事情卻沒按計劃發展。就像「為啥 XXX 有索引,根據它查詢還是慢查詢」。

此刻沒準要自信點:我的代碼不可能有 BUG,肯定是 MySQL 出了問題。MySQL 的確可能有點問題。

這種情況常見於建了一大堆索引,查詢條件一大堆。沒使用你想讓它用的那一個,而是選了個區分度低的,導致過多的掃描。造成的原因基本有兩個:

信息統計不準確:可以使用 analyze table x重新分析。優化器誤判:可以 force index強制指定。或修改語句引導優化器,增加或刪除索引繞過。但根據我淺薄的經驗來看,更可能是因為你建了些沒必要的索引導致的。不會真有人以為 MySQL 沒自己機靈吧?

除了上面這些索引原因外,還有下面這些不常見或者說不好判斷的原因存在。

1.2 等MDL鎖

在 MySQL 5.5 版本中引入了 MDL,對一個表做 CRUD 操作時,自動加 MDL 讀鎖;對表結構做變更時,加 MDL 寫鎖。讀寫鎖、寫鎖間互斥。

當某語句拿 MDL 寫鎖就會阻塞 MDL 讀鎖,可以使用show processlist命令查看處於Waiting for table metadata lock狀態的語句。

1.3 等 flush

flush 很快,大多是因為 flush 命令被別的語句堵住,它又堵住了 select 。通過show processlist命令查看時會發現處於Waiting for table flush狀態。

1.4 等行鎖

某事物持有寫鎖未提交。

1.5 當前讀

InnoDB 默認級別是可重複讀。設想一個場景:事物 A 開始事務,事務 B 也開始執行大量更新。B 率先提交, A 是當前讀,就要依次執行 undo log ,直到找到事務 B 開始前的值。

1.6 大表場景

在未二次開發的 MYSQL 中,上億的表肯定算大表,這種情況即使在索引、查詢層面做到了較好實現,面對頻繁聚合操作也可能會出現 IO 或 CPU 瓶頸,即使是單純查詢,效率也會下降。

且 Innodb 每個 B+ 樹節點存儲容量是 16 KB,理論上可存儲 2kw 行左右,這時樹高為3層。我們知道,innodb_buffer_pool 用來緩存表及索引,如果索引數據較大,緩存命中率就堪憂,同時 innodb_buffer_pool 採用 LRU 算法進行頁面淘汰,如果數據量過大,對老或非熱點數據的查詢可能就會把熱點數據給擠出去。

所以對於大表常見優化即是分庫分表和讀寫分離了。

1.6.1 分庫分表

方案

是分庫還是分表呢?這要具體分析。

如果磁碟或網絡有 IO 瓶頸,那就要分庫和垂直分表。如果是 CPU 瓶頸,即查詢效率偏低,水平分表。水平即切分數據,分散原有數據到更多的庫表中。垂直即按照業務對庫,按欄位對表切分。

工具方面有 sharding-sphere、TDDL、Mycat。動起手來需要先評估分庫、表數,制定分片規則選 key,再開發和數據遷移,還要考慮擴容問題。

問題

實際運行中,寫問題不大,主要問題在於唯一 ID 生成、非 partition key 查詢、擴容。

唯一 ID 方法很多,DB 自增、Snowflake、號段、一大波GUID算法等。非 partition key 查詢常用映射法解決,映射表用到覆蓋索引的話還是很快的。或者可以和其他 DB 組合。擴容要根據分片時的策略確定,範圍分片的話就很簡單,而隨機取模分片就要遷移數據了。也可以用範圍 + 取模的模式分片,先取模再範圍,可以避免一定程度的數據遷移。當然,如果分庫還會面臨事務一致性和跨庫 join 等問題。

1.6.2 讀寫分離

為什麼要讀寫分離

分錶針對大表解決 CPU 瓶頸,分庫解決 IO 瓶頸,二者將存儲壓力解決了。但查詢還不一定。

如果落到 DB 的 QPS 還是很高,且讀遠大於寫,就可以考慮讀寫分離,基於主從模式將讀的壓力分攤,避免單機負載過高,同時也保證了高可用,實現了負載均衡。

問題

主要問題有過期讀和分配機制。

過期讀,也就是主從延時問題,這個對於。分配機制,是走主還是從庫。可以直接代碼中根據語句類型切換或者使用中間件。1.7 小結

以上列舉了 MySQL 常見慢查詢原因和處理方法,介紹了應對較大數據場景的常用方法。

分庫分表和讀寫分離是針對大數據或並發場景的,同時也為了提高系統的穩定和拓展性。但也不是所有的問題都最適合這麼解決。

2. 如何評價 ElasticSearch

前文有提到對於關鍵字查詢可以使用 ES。那接著聊聊 ES 。

2.1 可以幹什麼

ES 是基於 Lucene 的近實時分布式搜尋引擎。使用場景有全文搜索、NoSQL Json 文檔資料庫、監控日誌、數據採集分析等。

對非數據開發來說,常用的應該就是全文檢索和日誌了。ES 的使用中,常和 Logstash, Kibana 結合,也成為 ELK 。先來瞧瞧日誌怎麼用的。

下面是我司日誌系統某檢索操作:打開 Kibana 在 Discover 頁面輸入格式如 「xxx」 查詢。

該操作可以在 Dev Tools 的控制臺替換為:

GET yourIndex/_search { "from" : 0, "size" : 10, "query" : { "match_phrase" : { "log" : "xxx" } } } 什麼意思?Discover 中加上 「」 和 console 中的 match_phrase 都代表這是一個短語匹配,意味著只保留那些包含全部搜索詞項,且位置與搜索詞項相同的文檔。

2.2 ES 的結構

在 ES 7.0 之前存儲結構是 Index -> Type -> Document,按 MySQL 對比就是 database - table - id(實際這種對比不那麼合理)。7.0 之後 Type 被廢棄了,就暫把 index 當做 table 吧。

在 Dev Tools 的 Console 可以通過以下命令查看一些基本信息。也可以替換為 crul 命令。

GET /_cat/health?v&pretty:查看集群健康狀態GET /_cat/shards?v :查看分片狀態GET yourindex/_mapping :index mapping結構GET yourindex/_settings :index setting結構GET /_cat/indices?v :查看當前節點所有索引信息重點是 mapping 和 setting ,mapping 可以理解為 MySQL 中表的結構定義,setting 負責控制如分片數量、副本數量。

以下是截取了某日誌 index 下的部分 mapping 結構,ES 對字符串類型會默認定義成 text ,同時為它定義一個叫做 keyword 的子欄位。這兩的區別是:text 類型會進行分詞, keyword 類型不會進行分詞。

"******": { "mappings": { "doc": { "properties": { "appname": { "type": "text", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } 2.3 ES 查詢為什麼快?

分詞是什麼意思?看完 ES 的索引原理你就 get 了。

ES 基於倒排索引。嘛意思?傳統索引一般是以文檔 ID 作索引,以內容作為記錄。倒排索引相反,根據已有屬性值,去找到相應的行所在的位置,也就是將單詞或內容作為索引,將文檔 ID 作為記錄。

下圖是 ES 倒排索引的示意圖,由 Term index,Team Dictionary 和 Posting List 組成。

圖中的 Ada、Sara 被稱作 term,其實就是分詞後的詞了。如果把圖中的 Term Index 去掉,是不是有點像 MySQL 了?Term Dictionary 就像二級索引,但 MySQL 是保存在磁碟上的,檢索一個 term 需要若干次的 random access 磁碟操作。

而 ES 在 Term Dictionary 基礎上多了層 Term Index ,它以 FST 形式保存在內存中,保存著 term 的前綴,藉此可以快速的定位到 Term dictionary 的本 term 的 offset 。而且 FST 形式和 Term dictionary 的 block 存儲方式都很節省內存和磁碟空間。

到這就知道為啥快了,就是因為有了內存中的 Term Index , 它為 term 的索引 Term Dictionary 又做了一層索引。

不過,也不是說 ES 什麼查詢都比 MySQL 快。檢索大致分為兩類。

2.3.1 分詞後檢索

ES 的索引存儲的就是分詞排序後的結果。比如圖中的 Ada,在 MySQL 中 %da% 就掃全表了,但對 ES 來說可以快速定位

2.3.2 精確檢索

該情況其實相差是不大的,因為 Term Index 的優勢沒了,卻還要藉此找到在 term dictionary 中的位置。也許由於 MySQL 覆蓋索引無需回表會更快一點。

2.4 什麼時候用 ES

如前所述,對於業務中的查詢場景什麼時候適合使用 ES ?我覺得有兩種。

2.4.1 全文檢索

在 MySQL 中字符串類型根據關鍵字模糊查詢就是一場災難,對 ES 來說卻是小菜一碟。具體場景,比如消息表對消息內容的模糊查詢,即聊天記錄查詢。

但要注意,如果需要的是類似廣大搜尋引擎的關鍵字查詢而非日誌的短語匹配查詢,就需要對中文進行分詞處理,最廣泛使用的是 ik 。Ik 分詞器的安裝這裡不再細說。

什麼意思呢?

分詞

開頭對日誌的查詢,鍵入 「我可真是個機靈鬼」 時,只會得到完全匹配的信息。

而倘若去掉 「」,又會得到按照 「我」、「可」,「真」….分詞匹配到的所有信息,這明顯會返回很多信息,也是不符合中文語義的。實際期望的分詞效果大概是「我」、「可」、「真是」,「機靈鬼」,之後再按照這種分詞結果去匹配查詢。

這是 ES 默認的分詞策略對中文的支持不友善導致的,按照英語單詞字母來了,可英語單詞間是帶有空格的。這也是不少國外軟體中文搜索效果不 nice 的原因之一。

對於該問題,你可以在 console 使用下方命令,測試當前 index 的分詞效果。

POST yourindex/_analyze { "field":"yourfield", "text":"我可真是個機靈鬼"} 2.4.2 組合查詢

如果數據量夠大,表欄位又夠多。把所有欄位信息丟到 ES 裡創建索引是不合理的。使用 MySQL 的話那就只能按前文提到的分庫分表、讀寫分離來了。何不組合下。

1)ES + MySQL

將要參與查詢的欄位信息加上 id,放入 ES,做好分詞。將全量信息放入 MySQL,通過 id 快速檢索。

2)ES + HBASE

如果要省去分庫分表什麼的,或許可以拋棄 MySQL ,選擇分布式資料庫,比如 HBASE , 對於這種 NOSQL 來說,存儲能力海量,擴容 easy ,根據 rowkey 查詢也很快。

以上思路都是經典的索引與數據存儲隔離的方案了。

當然,攤子越大越容易出事,也會面臨更多的問題。使用 ES 作索引層,數據同步、時序性、mapping 設計、高可用等都需要考慮。

畢竟和單純做日誌系統對比,日誌可以等待,用戶不能。

2.5 小結

本節簡單介紹了 ES 為啥快,和這個快能用在哪。現在你可以打開 Kibana 的控制臺試一試了。

如果想在 Java 項目中接入的話,有 SpringBoot 加持,在 ES 環境 OK 的前提下,完全是開箱即用,就差一個依賴了。基本的 CRUD 支持都是完全 OK 的。

3. HBASE

前面有提到 HBASE , 什麼是 HBASE ,鑑於篇幅這裡簡單說說。

3.1 存儲結構

關係型資料庫如 MySQL 是按行來的。

HBASE 是按列的(實際是列族)。列式存儲上表就會變成:

下圖是一個 HBASE 實際的表模型結構。

Row key 是主鍵,按照字典序排序。TimeStamp 是版本號。info 和 area 都是列簇(column Family),列簇將表進行橫向切割。name、age 叫做列,屬於某一個列簇,可進行動態添加。Cell 是具體的 Value 。

3.2 OLTP 和 OLAP

數據處理大致可分成兩大類:聯機事務處理OLTP(on-line transaction processing)、聯機分析處理OLAP(On-Line Analytical Processing)。

OLTP是傳統的關係型資料庫的主要應用,主要是基本的、日常的事務處理。OLAP是數據倉庫系統的主要應用,支持複雜分析,側重決策支持,提供直觀易懂的查詢結果。面向列的適合做 OLAP,面向行的適用於聯機事務處理(OLTP)。不過 HBASE 並不是 OLAP ,他沒有 transaction,實際上也是面向 CF 的。一般也沒多少人用 HBASE 做 OLAP 。

3.3 RowKey

HBASE 表設計的好不好,就看 RowKey 設計。這是因為 HBASE 只支持三種查詢方式

1、基於 Rowkey 的單行查詢 2、基於 Rowkey 的範圍掃描 3、全表掃描

可見 HBASE 並不支持複雜查詢。

3.4 使用場景

HBASE 並非適用於實時快速查詢。它更適合寫密集型場景,它擁用快速寫入能力,而查詢對於單條或小面積查詢是 OK 的,當然也只能根據 rowkey。但它的性能和可靠性非常高,不存在單點故障。

4. 總結

個人覺得軟體開發是循序漸進的,技術服務於項目,合適比新穎複雜更重要。

如何完成一次快速的查詢?最該做的還是先找找自己的 Bug,解決了當前問題再創造新問題。

本文列舉到的部分方案對於具體實現大多一筆帶過,實際無論是 MySQL 的分表還是 ES 的業務融合都會面臨很多細節和困難的問題,搞工程的總要絕知此事要躬行。

參考

億級流量系統架構之如何設計每秒十萬查詢的高並發架構 https://juejin.im/post/5bfe771251882509a7681b3a使用 ELK 搭建日誌集中分析平臺 https://wsgzao.github.io/post/elk/)https://wsgzao.github.io/post/elk/MySQL和Lucene索引對比分析https://www.cnblogs.com/luxiaoxun/p/5452502.htmlHBASE 深入淺出 https://www.ibm.com/developerworks/cn/analytics/library/ba-cn-bigdata-hbase/index.html作者:llc687https://llc687.top/post/

相關焦點

  • 後端接口如何提高性能?從MySQL、ES、HBASE等技術一起探討下!
    說到最左前綴,實際就是組合索引的使用規則,使用合理組合索引可以有效的提高查詢速度,為什麼呢?因為索引下推。如果查詢條件包含在了組合索引中,比如存在組合索引(a,b),查詢到滿足 a 的記錄後會直接在索引內部判斷 b 是否滿足,減少回表次數。
  • 經典面試題:ES如何做到億級數據查詢毫秒級返回?
    面試題es 在數據量很大的情況下(數十億級別)如何提高查詢效率啊?面試官心理分析這個問題是肯定要問的,說白了,就是看你有沒有實際幹過 es,因為啥?其實 es 性能並沒有你想像中那麼好的。其實,僅僅寫入 es 中要用來檢索的少數幾個欄位就可以了,比如說就寫入 es id,name,age 三個欄位,然後你可以把其他的欄位數據存在 mysql/hbase 裡,我們一般是建議用 es + hbase 這麼一個架構。
  • JAVA 經典面試題:ES如何做到億級數據查詢毫秒級返回?
    #elasticsearch#lasticsearch在數十億級別以上的大量數據下如何提高查詢效率其實,僅僅寫入 elasticsearch 中要用來檢索的少數幾個欄位就可以了,比如說就寫入 es id,name,age 三個欄位,然後你可以把其他的欄位數據存在 mysql/hbase 裡,我們一般是建議用 elasticsearch + hbase 這麼一個架構。
  • 大數據查詢——HBase讀寫設計與實踐
    AI 前線導語:本文介紹的項目主要解決 check 和 opinion2 張歷史數據表(歷史數據是指當業務發生過程中的完整中間流程和結果數據)的在線查詢。原實現基於 Oracle 提供存儲查詢服務,隨著數據量的不斷增加,在寫入和讀取過程中面臨性能問題,且歷史數據僅供業務查詢參考,並不影響實際流程,從系統結構上來說,放在業務鏈條上遊比較重。
  • 如何優化Web應用數據訪問實現方式以提高軟體應用系統的響應性能
    軟體項目實訓及課程設計指導——如何優化Web應用數據訪問實現方式以提高軟體應用系統的響應性能在軟體應用系統中離不開數據訪問和數據處理兩個方面的功能,而數據處理之前首先要進行數據訪問,也就是只有快速地獲得了數據,才能進行下一步的數據處理。
  • HBase調優 | HBase Compaction參數調優
    Compaction的主要目的: 1.將多個HFile 合併為較大HFile,從而提高查詢性能 2.減少HFile 數量,減少小文件對HDFS
  • 通過Java API 像 MySQL一樣查詢HBASE
    隨著大數據的應用普及,HBASE作為一種非常適應海量數據存儲和查詢的資料庫也逐步流行起來。
  • MySQL資料庫接口的VC實現與應用(1)
    引言隨著現代計算機軟硬體及網絡技術的發展,在網上查找資料已成為現在獲取信息的最重要手段之一。眾所周知,所有的網上信息都是儲存在網站資料庫中的,這些信息的查詢、更新等操作的功能則是由資料庫伺服器提供的,顯然,資料庫伺服器的性能將直接關係到網站的生存。網站搭建中用的最多的資料庫伺服器是oracle和MySQL,前者功能強大,屬於旗艦型資料庫伺服器,但前期投入太大;後者功能不斷完善,簡單易用而又不失性能,並且可以免費獲得。
  • 從Web查詢資料庫之PHP與MySQL篇
    PHP+MySQL的組合是構建網站的一個常見搭配,不過如何使用PHP通過Web訪問MySQL資料庫呢?下面從Web資料庫架構的工作原理講起。
  • MySQL如何完成一次查詢?
    mysql完成一次查詢過程是比較複雜的,在說明查詢過程前先介紹一下它的基礎概念和結構原理來幫助理解。下面從四個方面介紹,分別是mysql語句,mysql結構原理,mysql查詢過程,最後設置幾個有趣問題。
  • MySQL中如何使用流式查詢避免數據量過大導致OOM?
    當指定條件的數據量特別大時候一般是通過分頁的方式在前端頁面通過 Tag 標籤一頁頁的加載數據到內存;但是有些情況下卻不需要用戶切換 Tag 標籤的方式一頁頁的加載數據,這時候如果一下子全部把數據加載內存,就有可能會導致 OOM,雖然這時候可以通過程序控制分頁查詢,但是每次查詢時候資料庫都需要把所有符合條件的數據查詢出來然後根據當前頁的返回來返回指定的頁,這無疑加重了 MySQL
  • 搞懂Hadoop、MapReduce、Hive、HBase、YARN及Spark的區別與聯繫
    數據裝入過程中,實際數據會移動到數據表,所在的hive數據倉庫文件目錄中,其後對該數據表的訪問,將直接訪問所對應文件目錄中的數據。hbase的刪除操作hbase批量命令bulkload為hbase的批量插入命令,應用於大數據量的插入,沒有性能問題。
  • 面試被問:JDBC底層是如何連接資料庫的?|sql|mysql|數據源|java|...
    JDBC由一組用Java語言編寫的類和接口組成。各種不同類型的資料庫都有相應的實現,注意:本文中的代碼都是針對MySQL資料庫實現的。  JDBC 架構  分為雙層架構和三層架構。  雙層  作用:此架構中,Java Applet 或應用直接訪問數據源。  條件:要求 Driver 能與訪問的資料庫交互。
  • MYSQL logstash 同步數據到es的幾種方案對比以及每種方案數據丟失原因分析.
    MYSQL logstash 同步增量數據到ES最近一段時間,在使用mysql通過logstash-jdbc同步數據到es,但是總是會有一定程度數據丟失。logstash-jdbc無非是通過sql遍歷數據表的所有數據,然後同步到es。對於表裡面的所有欄位都需要查出來然後同步到es中去。
  • 淺析前後端數據交互
    想要做好網際網路產品的設計,就要對一些基本的技術實現原理有所了解,本文將對網際網路產品的前後臺數據交互做一個小的總結。(技術大神輕噴)HTTP協議前後臺交互的協議不只有HTTP協議,本文僅以HTTP協議為例。HTTP協議即超文本傳輸協議,是網際網路上應用最為廣泛的一種網絡協議。
  • ...數據分析及生態系統分論壇:HBase、Spark、ES、Kylin及Octopus...
    以及其中的實時處理、實時分析、後期的數據挖掘,甚至是中間的聯動環節、可視化處理,都需要用大數據來進行實現。IBM的大數據簡易分析框架由前端數據採集、預處理、數據挖掘、可視化分析組成。IBM SQL基於Hadoop技術,用戶可通過不同的方式訪問數據。IBM相關的雲方案:在IBM提供的雲環境下面,用戶可以得到IBM不同軟體的相關服務,其中Spark的也可以用雲的方式來做。
  • MySQL的limit用法和分頁查詢的性能分析及優化
    ,經常要返回前幾條或者中間某幾行數據,這個時候怎麼辦呢?不用擔心,mysql已經為我們提供了這樣一個功能。二、Mysql的分頁查詢語句的性能分析MySql分頁sql語句,如果和MSSQL的TOP語法相比,那麼MySQL的LIMIT語法要顯得優雅了許多。使用它來分頁是再自然不過的事情了。最基本的分頁方式:SELECT ... FROM ... WHERE ... ORDER BY ... LIMIT ...
  • 基於MySQL的高性能資料庫應用開發
    以作者在開發股市行情查詢和交易系統中遇到的問題為例,要在實時記錄1000多隻股票每分鐘更新一次的行情數據的同時,響應大量並發用戶的數據查詢請求。考慮到性價比和易維護性,系統又要求在基於PC伺服器,Windows NT平臺的軟硬體環境下實現。
  • 深入 HBase 架構解析
    Table的內容而獲取此次請求需要訪問的HRegion所在的位置,然後訪問該HRegionSever獲取請求的數據,這需要三次請求才能找到用戶Table所在的位置,然後第四次請求開始獲取真正的數據。當然為了提升性能,客戶端會緩存-ROOT- Table位置以及-ROOT-/.META. Table的內容。如下圖所示:
  • MySQL 工作、底層原理,看這一篇就夠了!
    它根據MySql AB公司提供的文件訪問層的一個抽象接口來定製一種文件訪問機制(這種訪問機制就叫存儲引擎)SQL 語句執行過程資料庫通常不會被直接使用,而是由其他程式語言通過SQL語句調用mysql,由mysql處理並返回執行結果。那麼Mysql接受到SQL語句後,又是如何處理?