搜尋
首頁資料庫mysql教程MySQL大數據查詢效能最佳化教學(圖)

MySQL效能最佳化包含表格的最佳化與列類型選擇,表的最佳化可以細分為什麼?  1、定長與變長分離;2、常用字段與不常用字段要分離;  3、在1對多,需要關聯統計的字段上添加冗餘字段。

一、表格的最佳化與欄位型別選擇

#表的最佳化:

        #1、延長與變長分離

                如id int,佔4個位元組,char(4)佔4個字元長度,也是定長,time即每個單元值佔的位元組是固定的。

                核心且常用字段,宜建成定長,放在一張表中。

                而varchar,text,blob這種變長字段,適合單放一張表,用主鍵與核心表關聯。

        2、常用欄位與不常用欄位要分離

                選擇結合網站特定的業務來分析,分析欄位的查詢場景,查詢頻率較低的欄位,單一頻率值拆出來。

        3、在1對多,需要關聯統計的欄位上新增冗餘欄位。

                看如下的效果:

MySQL大數據查詢效能最佳化教學(圖)

##               「每個版塊中,有一個版本的貼文數。

                這是如何做的

MySQL大數據查詢效能最佳化教學(圖)

           ,select count(*) from post group by board_id,得出每個版塊的貼文數。

二、列型別選擇

        1、欄位類型優先權

         整數>date#;date

#;date

#;date

#;date

#; ##         time>enum

        char>varchar>blob,text

        整數:定長,沒有國家/地區之分,也沒有字元集的差異。例如:

       tinyint 1,2,3,4,5 char(1) a,b,c,d,e

       從空間上,皆佔1個字節,但是order by 排序,前者快。原因,或需要考慮字元集與校對集(就是排序規則);

       time定長,運算快,節省空間。考慮時區,寫sql時不方便where > `2018-08-08`;

       enum,能起到約束的目的,內部用整數來存儲,但與cahr聯查時,內部要經歷串與值的轉換;

       char定長,考慮字元集與(排序)校對集;

       varchar不定長,要考慮字元集的轉換與排序時的校對集,速度慢;

       text/blob 無法使用記憶體臨時表(排序等作業只能在磁碟上進行)

       附:關於date/time的選擇,大師的明確意見,直接選int unsgined not null,儲存時間戳記。

      例如:

##      性別:以utf8為例

      char(1) ,3個字長位元組

##   頟 enum('男','女'); 內部轉成數字來存,多一個轉換過程

      tinyint(), 定長1個字節

   

  2、夠用就行,不要慷慨(如smallint varchar(N))

      原因:大的位元組浪費內存,影響速度。

      以年齡為例 tinyint unsigned not null,可儲存255歲,足夠。用int浪費了3個位元組;

      以varchar(10),varchar(300)儲存的內容相同,但在表聯查時varchar(300)要花更多記憶體。

     

3、盡量避免用NULL()

      原因:NULL不利於索引,要用特殊的字元來標示。

      在磁碟上佔據的空間其實更大(MySQL5.5已對null做的改進,但查詢仍是不便)

三、索引最佳化策略

1、索引類型

       

1.1 B-tree索引

#

        名叫btree索引,大的面向看,都用的平衡樹,但具體的實現上,各引擎稍有不同,比如,嚴格的說,NDB引擎,使用的是T-tree.

       但抽像B-tree系統,可理解為「排好序的快速查詢結構」。

       1.2 hash索引

       在memory表裡預設為hash索引,hash的理論查詢時間複雜度為O(1)。

       疑問:既然hash的查找如此高效,為什麼不都用hash索引?

       回答:

      1、hash函數計算後的結果,是隨機的,如果是在磁碟上放置數據,以主鍵為id為例,那麼隨著id的增長,id對應的行,在磁碟上隨機放置。

      2、無法對範圍查詢進行最佳化。

      3、無法利用前綴索引,例如在btree中,field列的值「helloworld」,並加上索引查詢x=helloworld自然可以利用索引,x=hello也可以利用索引(左前綴索引) 。

       4、排序也無法最佳化。

       5、必須回行,就是說透過索引拿到資料位置,必須回到表格中取資料。

        2、btree索引的常見誤解

       2.1 在where條件常用的欄位加索引,例如:

       where cat_p ;100;查詢第三個欄目,100元以上的商品。

       誤解:cat_id 上方和price上都加上索引。

       錯:只能使用上cat_id 或 price索引,因為是獨立的索引,同時只能用一個。

       2.2 在多列上建立索引後(共同索引),查詢哪個列,索引都會將發揮作用

       誤區:多列索引上,索引發揮作用,需要滿足左前綴要求。

       以index(a,b,c) 為例,(注意力和順序有關)

MySQL大數據查詢效能最佳化教學(圖)

4、索引實驗

        例如:select * from t4 where c1=3 and c2 = 4 and c4>5 and c3=2;

##       使用了哪些索引:##se# from#      explect   where c1=3 and c2 = 4 and c4>5 and c3=2 \G

      如下:

           )MySQL大數據查詢效能最佳化教學(圖)

五、叢集索引與非叢集索引

Myisam與innodb引擎,索引檔案的異同

Myisam:由news.myd和new.myi兩個文件,索引文件和資料檔是分開的,叫做非叢集索引。主索引和次索引都指向實體行(磁碟的位置)

innodb:索引和資料是聚在一起的,所以是叢集索引。 innodb的主索引檔案上直接存放該行數據,次索引指向對主鍵索引的引用。

注意:innodb來說:

1、主鍵索引 即存放索引值,又在葉子中儲存行的資料。

2、如果沒有主鍵(primary key),則會unique key做主鍵。

3、如果沒有unique,則係統產生一個內部的rowid做主鍵。

4、像innodb中,主鍵的索引結構中,即儲存了主鍵值又儲存了行數據,這種結構稱為叢集索引。

叢集索引

優點:根據主鍵查詢項目比較少時,不用回行(資料就在主鍵節點下)

劣勢:如果碰到不規則資料插入時,造成頻繁的頁分裂

相關文章:

Mysql 效能最佳化

##相關影片:

MySQL優化影片教學

#

以上是MySQL大數據查詢效能最佳化教學(圖)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
MySQL與Sqlite有何不同?MySQL與Sqlite有何不同?Apr 24, 2025 am 12:12 AM

MySQL和SQLite的主要區別在於設計理念和使用場景:1.MySQL適用於大型應用和企業級解決方案,支持高性能和高並發;2.SQLite適合移動應用和桌面軟件,輕量級且易於嵌入。

MySQL中的索引是什麼?它們如何提高性能?MySQL中的索引是什麼?它們如何提高性能?Apr 24, 2025 am 12:09 AM

MySQL中的索引是數據庫表中一列或多列的有序結構,用於加速數據檢索。 1)索引通過減少掃描數據量提升查詢速度。 2)B-Tree索引利用平衡樹結構,適合範圍查詢和排序。 3)創建索引使用CREATEINDEX語句,如CREATEINDEXidx_customer_idONorders(customer_id)。 4)複合索引可優化多列查詢,如CREATEINDEXidx_customer_orderONorders(customer_id,order_date)。 5)使用EXPLAIN分析查詢計劃,避

說明如何使用MySQL中的交易來確保數據一致性。說明如何使用MySQL中的交易來確保數據一致性。Apr 24, 2025 am 12:09 AM

在MySQL中使用事務可以確保數據一致性。 1)通過STARTTRANSACTION開始事務,執行SQL操作後用COMMIT提交或ROLLBACK回滾。 2)使用SAVEPOINT可以設置保存點,允許部分回滾。 3)性能優化建議包括縮短事務時間、避免大規模查詢和合理使用隔離級別。

在哪些情況下,您可以選擇PostgreSQL而不是MySQL?在哪些情況下,您可以選擇PostgreSQL而不是MySQL?Apr 24, 2025 am 12:07 AM

選擇PostgreSQL而非MySQL的場景包括:1)需要復雜查詢和高級SQL功能,2)要求嚴格的數據完整性和ACID遵從性,3)需要高級空間功能,4)處理大數據集時需要高性能。 PostgreSQL在這些方面表現出色,適合需要復雜數據處理和高數據完整性的項目。

如何保護MySQL數據庫?如何保護MySQL數據庫?Apr 24, 2025 am 12:04 AM

MySQL數據庫的安全可以通過以下措施實現:1.用戶權限管理:通過CREATEUSER和GRANT命令嚴格控制訪問權限。 2.加密傳輸:配置SSL/TLS確保數據傳輸安全。 3.數據庫備份和恢復:使用mysqldump或mysqlpump定期備份數據。 4.高級安全策略:使用防火牆限制訪問,並啟用審計日誌記錄操作。 5.性能優化與最佳實踐:通過索引和查詢優化以及定期維護兼顧安全和性能。

您可以使用哪些工具來監視MySQL性能?您可以使用哪些工具來監視MySQL性能?Apr 23, 2025 am 12:21 AM

如何有效監控MySQL性能?使用mysqladmin、SHOWGLOBALSTATUS、PerconaMonitoringandManagement(PMM)和MySQLEnterpriseMonitor等工具。 1.使用mysqladmin查看連接數。 2.用SHOWGLOBALSTATUS查看查詢數。 3.PMM提供詳細性能數據和圖形化界面。 4.MySQLEnterpriseMonitor提供豐富的監控功能和報警機制。

MySQL與SQL Server有何不同?MySQL與SQL Server有何不同?Apr 23, 2025 am 12:20 AM

MySQL和SQLServer的区别在于:1)MySQL是开源的,适用于Web和嵌入式系统,2)SQLServer是微软的商业产品,适用于企业级应用。两者在存储引擎、性能优化和应用场景上有显著差异,选择时需考虑项目规模和未来扩展性。

在哪些情況下,您可以選擇SQL Server而不是MySQL?在哪些情況下,您可以選擇SQL Server而不是MySQL?Apr 23, 2025 am 12:20 AM

在需要高可用性、高級安全性和良好集成性的企業級應用場景下,應選擇SQLServer而不是MySQL。 1)SQLServer提供企業級功能,如高可用性和高級安全性。 2)它與微軟生態系統如VisualStudio和PowerBI緊密集成。 3)SQLServer在性能優化方面表現出色,支持內存優化表和列存儲索引。

See all articles

熱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

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

熱工具

MantisBT

MantisBT

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

EditPlus 中文破解版

EditPlus 中文破解版

體積小,語法高亮,不支援程式碼提示功能

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

SublimeText3 Mac版

SublimeText3 Mac版

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