MySQL效能最佳化包含表格的最佳化與列類型選擇,表的最佳化可以細分為什麼? 1、定長與變長分離;2、常用字段與不常用字段要分離; 3、在1對多,需要關聯統計的字段上添加冗餘字段。
一、表格的最佳化與欄位型別選擇
#表的最佳化:
#1、延長與變長分離
如id int,佔4個位元組,char(4)佔4個字元長度,也是定長,time即每個單元值佔的位元組是固定的。
核心且常用字段,宜建成定長,放在一張表中。
而varchar,text,blob這種變長字段,適合單放一張表,用主鍵與核心表關聯。
2、常用欄位與不常用欄位要分離
選擇結合網站特定的業務來分析,分析欄位的查詢場景,查詢頻率較低的欄位,單一頻率值拆出來。
3、在1對多,需要關聯統計的欄位上新增冗餘欄位。
看如下的效果:
二、列型別選擇
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) 為例,(注意力和順序有關) 4、索引實驗 例如:select * from t4 where c1=3 and c2 = 4 and c4>5 and c3=2; ) 五、叢集索引與非叢集索引 Myisam與innodb引擎,索引檔案的異同 注意:innodb來說: 1、主鍵索引 即存放索引值,又在葉子中儲存行的資料。 叢集索引 優點:根據主鍵查詢項目比較少時,不用回行(資料就在主鍵節點下) Mysql 效能最佳化
以上是MySQL大數據查詢效能最佳化教學(圖)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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

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

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

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

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

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

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

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


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

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

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

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

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

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