Spring Boot 查詢
@Query(value="SELECT *
FROM products p
join product_generic_name pg on pg.id = p.product_generic_name_id
where (p.product_name like %?1%
and p.parent_product_id IS NULL
and p.is_active=true and
(p.is_laboratory is null or p.is_laboratory = false)
)
or (pg.product_generic_name like %?1%
and pg.is_active = true) ",nativeQuery = true)
Page<Products> findByProductNameLikeAndGenericNameLike(String searchText, Pageable pageable);
產品表有超過300萬個條目,查詢大約需要4分鐘才能完成。如何優化查詢性能。我嘗試索引 product_name 列,但沒有太大的性能改進。
uj5u.com熱心網友回復:
有兩個瓶頸:
like %?1%-- 前導通配符意味著它必須讀取并檢查每一行。OR-- 這很少可以優化。
如果like %?1%只看“單詞”,那么使用FULLTEXT索引MATCH會運行得更快。
OR可以變成一個UNION。它可能應該是UNION DISTINCT,假設?1可以同時在name和 中generic_name。
更多的記憶體、更多的常規索引等等——這些不太可能有幫助。 EXPLAIN和其他分析工具告訴你是怎么回事,現在,而不是如何提高查詢和/或索引。碎片整理(在 InnoDB 中)主要是浪費時間。CPU 速度范圍很窄;這在 20 多年來沒有改變。額外的核心是無用的,因為 MySQL 將僅使用一個核心來進行此查詢。僅僅 3M 行意味著您可能擁有足夠多的 RAM。
uj5u.com熱心網友回復:
向 product_name 添加索引無濟于事,因為您正在對其進行類似搜索,而不是完全匹配。對于您的查詢,您應該將索引添加到:
- 活躍
- is_實驗室
- parent_product_id
然而,在搜索開始和結束時使用兩個通配符進行“自由文本”搜索對于關系資料庫來說并不是一個很好的用例。這是解決這個問題的最佳設計嗎?如果你有 300 萬個產品,你能不能有一個“product_group”,用戶必須選擇它來減少要搜索的行數?或者,這是一個非常適合像 ElasticSearch 或 Solr 這樣的全文搜索引擎的用例。
uj5u.com熱心網友回復:
這是一個非常開放的問題,我想說。
我會盡力為你打破它。
有幾件事你可以,除非你還沒有。
技巧 1:優化查詢 在許多情況下,資料庫性能問題是由低效的 SQL 查詢引起的。優化 SQL 查詢是提高資料庫性能的最佳方法之一。當您嘗試手動執行此操作時,您會在選擇如何最好地提高查詢效率方面遇到一些困境。其中包括了解是撰寫聯接還是子查詢,是使用 EXISTS 還是 IN 等等。當您知道前進的最佳路徑時,您就可以撰寫提高效率的查詢,從而提高整個資料庫的性能。這意味著更少的瓶頸和更少的不滿意的最終用戶。
優化查詢的最佳方法是使用資料庫性能分析解決方案,該解決方案可以通過將您引導至效率最低的查詢并提供有關如何最好地改進它們的專家建議來指導您的優化作業。
技巧 2:改進索引 除了查詢之外,資料庫的另一個基本元素是索引。如果做得好,索引可以提高資料庫性能并幫助優化查詢執行的持續時間。索引創建的資料結構有助于使所有資料井井有條,并使查找資訊變得更加容易。因為更容易查找資料,所以索引提高了資料檢索的效率并加快了整個程序,為您和系統節省了時間和精力。
技巧 3:碎片整理資料 資料碎片整理是提高資料庫性能的最佳方法之一。隨著時間的推移,隨著大量資料不斷寫入資料庫和從資料庫中洗掉,您的資料可能會變得碎片化。這種碎片可能會減慢資料檢索程序,因為它會干擾查詢快速定位所需資訊的能力。當您對資料進行碎片整理時,您可以將相關資料組合在一起并消除索引頁問題。這意味著您的 I/O 相關操作將運行得更快。
技巧 4:增加記憶體 當您沒有足夠的可用記憶體讓資料庫正常作業時,您的資料庫效率會受到很大影響。即使看起來您總共有很多記憶體,您也可能無法滿足資料庫的需求。確定您是否需要更多記憶體的一個好方法是檢查您的系統有多少頁面錯誤。當故障數量很高時,這意味著您的主機要么運行不足,要么完全沒有可用記憶體。增加記憶體分配將有助于提高效率和整體性能。
技巧 5:加強 CPU 更好的 CPU 直接轉化為更高效的資料庫。這就是為什么您在遇到資料庫性能問題時應該考慮升級到更高級別的 CPU 單元的原因。您的 CPU 越強大,處理多個請求和應用程式時的壓力就越小。在評估您的 CPU 時,您應該跟蹤 CPU 性能的所有元素,包括 CPU 就緒時間,它告訴您系統嘗試使用 CPU 的時間,但由于資源被其他原因占用而無法使用。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/363266.html
上一篇:跨微服務的事務
下一篇:SpringDataJpaRepository在使用getById()方法時拋出LazyInitializationException而在使用findById()時不會拋出
