常見業務處理-電商數據庫設計及優化學習筆記

一、背景

這是我的電商數據庫設計及優化學習筆記的常見業務處理部分內容。
這裏的筆記之前已經做好了但是不小心弄丟了,爲了整理好只好再看了一遍,多看一遍又有了新的收穫。

二、業務處理

1、如何對評論數據進行分頁展示
1、1 執行計劃
通常的SQL:

SELECT customer_id,title,content
FROM 'product_comment'
WHERE audit_status=1
AND product_id=199726
LIMIT 0,5;

在頁面上分頁顯示product_id=199726的評論,每次只取出5條數據進行分頁。
但是在日常工作中除了要取出數據之外還要保證數據庫高效地運行。
我們如何知道這個SQL的執行效率呢,又怎麼知道這些表上的索引呢?
我們要看一下SQL的執行計劃了,
要查看執行計劃只要在SQL語句前加上EXPLAIN 就可以了
EXPLAIN關鍵字支持 select update insert replace he delete 這些語句的執行計劃的分析。
通過執行計劃我們可以知道MySQL服務器是如何處理我們提交的請求的。我們可以從執行計劃中獲得以下信息:
1、SQL是如何使用索引的,
2、還可以確認在關聯查詢時連接查詢的執行順序,
3、還可以查詢掃描的數據的行數,可以從另一個方面說明SQL有沒有正確使用索引。
執行計劃中的內容

但是執行計劃也存在一些限制:
1、無法展示存儲過程,觸發器,UDF對查詢的影響
2、無法使用EXPLAIN對存儲過程進行分析
3、早期版本的MySQL只支持對SELECT語句進行分析。
1、2 優化評論分頁查詢
上面語句的查詢結果:
這裏寫圖片描述
可以看到 這條SQL的possible_keys,key,以及key_len的值都爲null,說明這條SQL在product_comment表上是沒有可用的索引的。
根據索引規範,可以考慮在WHERE條件語句上建立索引,在這個SQL上有兩列,分別是audit_status和product_id,因此可以考慮在這兩列上建立聯合索引。
根據索引設計規範,我們要計算一下這兩列數據在表中的區分度,區分度接近1越好,應該把區分度比較好的放在聯合索引的左側。
使用SQL語句計算出區分度:

SELETC COUNT(DISTINCT audit_status)/COUNT(*)
AS audit_rate,
COUNT(DISTINCT product_status)/COUNT(*)
AS product_rate
FROM product_comment;

執行結果爲 audit_rate 0.0001,product_rate 0.8127
因此我們應該建立一個安照product_id列和audit_id列的順序的聯合索引,product_id列應該放在左側:

create index idx_productID_auditStatus on product_comment(product_id,audit_id)

2、進一步優化評論分頁查詢
前面的查詢方式 數據庫的訪問開銷=索引IO+索引全部記錄的的結果的表對影的數據的IO,這樣的缺陷是越往後查詢越慢,爲了進一步優化查詢,可以對SQL進行改寫,改寫後的SQL應該和改寫前的SQL在相同的情況下查詢結果集是一樣的,但是改寫後的效率比較高。
假設商品評論表的主鍵是comment_id而且有覆蓋索引,優化語句:

SELECT t.customer_id,t.title,t.content
FROM(
SELECT 'comment_id'
FROM product_comment
WHERE product_id=199727 AND audit_status=1|LIMIT 0,15
) a JOIN product_comment t
ON a.comment_id=t.comment_id;

這樣改寫方式的優點是每次翻頁消耗的時間都是相同的,適用場景是當查詢和排序字段有對於的覆蓋索引時

3、刪除重複數據
刪除評論表中同一訂單商品的重複評論,只保留最早的一條
3.1、查看是否存在這一的重複評論
在SQL圖形化工具下查看是否存在重複評論:

SELECT order_id,product_id,COUNT(*)
FROM product_comment
GROUP BY order_id,product_id HAVING COUNT(*)>1

3.2、備份product_comment表
建立一個備份表並把數據庫複製過去:

CREATE TABLE bak_product_comment_180823 AS SELECT * FROM product_comment

或者

CREATE TABLE bak_product_comment_180823 LIKE product_comment

如果我們的表數據量比較大可以使用mysqldump的方式來備份,這個表數據量比較小,所以可以直接這樣備份。
然後把數據插入到備份表中:

INSERT INTO bak_product_comment_180823 SELECT * FROM product_comment

3.3、刪除統一訂單的重複評論

SELECT a
FROM product_comment a
JOIN(
SELECT order_id,product_id,MIN(comment_id)AS comment_id
FROM product_comment
GROUP BY order_id,product_id
HAVING COUNT(*)>2
) b ON a.order_id=b.order_id AND a.product_id=b.product_id AND a.comment_id=b.comment_id 

這樣就完成了刪除重複數據的目的。

4、如何進行分區間統計
統計消費金額大於1000元的,800-1000的,500-800的以及500以下的。
語句:

SELECT 
COUNT(CASE WHEN IFNULL(total_money,0)>=1000 THEN a.customer_id END) AS '>1000',
COUNT(CASE WHEN IFNULL(total_money,0)>=1000 AND (CASE WHEN IFNULL(total_money,0)<1000 THEN a.customer_id END) AS '800-1000',
COUNT(CASE WHEN IFNULL(total_money,0)>=500 AND (CASE WHEN IFNULL(total_money,0)<8000 THEN a.customer_id END) AS '500-800',
COUNT(CASE WHEN IFNULL(total_money,0)<500 THEN a.customer_id END) AS '<500'
FROM mc_userdb.'customer_login' a
LEFT JOIN(
SELECT customer_id,SUM(order_money) AS total_money
FROM mc_userdb.'order_master' GROUP BY customer_id
) b ON a.'customer_id=b.'customer_id';

爲了統計消費,先通過子查詢先查出所有有消費記錄的用戶消費總額,由於要查詢所有的用戶,所以使用用戶登錄日誌表對子查詢進行左關聯,然後使用count對統計結果進行分區,
以後遇到類似問題也可以用CASE+COUNT來進行統計,CASE是非常好用的分區方式。

5、捕獲有問題的SQL
我們可以通過啓用慢查詢日誌,來發現需要優化的SQL,慢查詢日誌會把符合我們條件的業務放到慢查詢日誌中
要啓用慢查詢日誌,需要設置一下變量:
1、文件位置:

set global slow_query_log_file=/sql_log/slow_log.log

2、設置是否對未使用索引的日誌進行抓取

set global log_queries_not_using_indexes=on;

3、抓取執行時間超過多少(秒)的SQL

set global log_query_time = 0.001

4、設置以後就可以啓動了

set global slow_query_log=on

啓用之後就可以有目的地對SQL進行優化了
慢查詢日誌中的內容:
time:執行查詢的時間
user@host:查詢的用戶和客戶端ip id列是進程的id
query_time:是在MYSQL上執行查詢的時間
lock_time:執行查詢時對數據庫鎖定的時間
rows_examined:爲了返回前面的行數所讀取的行數,可以看出查詢有沒有正確使用索引。
最後就是SQL語句的內容啦

分析慢查詢日誌

mysqldumpslow slow-mysql.log

結果跟慢查詢日誌結果非常相似,多了一行Count,是在慢查詢期間SQL執行次數。
通過慢查詢日誌的分析,我們可以知道哪些SQL是需要進行優化的。

三、小結

學習到了常用業務問題的處理方法:
如何對評論數據進行分頁展示
進一步優化評論分頁查詢
刪除重複數據
捕獲有問題的SQL

以後再學習工作的過程中遇到類似問題也可以使用這樣的思路來解決。不懂的地方多看幾遍,會有新的 收穫。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章