只做錯的題目>做錯又做對的題目>只做對的題目。"/>

国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Mysql - MySQL性能優化 出題業務SQL優化

MySQL性能優化 出題業務SQL優化

2019-11-10 16:43mysql教程網 Mysql

根據用戶的作答結果出練習卷,題目的優先級為:未做過的題目>只做錯的題目>做錯又做對的題目>只做對的題目。

先簡單介紹一下項目背景。這是一個在線考試練習平臺,數據庫使用MySQL,表結構如圖所示:

MySQL性能優化 出題業務SQL優化

Question是存儲題目的表,數據量在3萬左右。AnswerResult表是存儲用戶作答結果的表,分表之后單表記錄大概在300萬-400萬。

需求:根據用戶的作答結果出練習卷,題目的優先級為:未做過的題目>只做錯的題目>做錯又做對的題目>只做對的題目。

在“做錯又做對的題目”中,會按錯誤次數和正確次數的比例進行權重計算,比如:A、做錯10次,做對100次;B、做錯10次,做對20次。這時B被選中出給用戶練習的概率就大。

備注:AnswerResult表中不存在QuestionId的記錄,則代表該題沒有做過。

之前使用的方法:

  SELECT Question.題目標識,IFNULL((0-正確次數)/(正確次數+錯誤次數),1) AS 權重 FROM Question

  LEFT JOIN AnswerResult ON AnswerResult.題目標識 = Question.題目標識

  WHERE 用戶標識={UserId}

說明:IFNULL((0-正確次數)/(正確次數+錯誤次數),1)這個函數式分2部分,

公式:(0-正確次數)/(正確次數+錯誤次數)得到題目的權重,這個區間為[0,-1],0表示只做錯的題目,-1表示只做對的題目。IFNULL(value,1)則將未做過的題目權重設置為1,根據這個權重進行排序列出題目。

由于AnswerResult表是多達300、400百萬的表,所以通過LEFT JOIN進行左連接時,迪卡爾乘積過大,又加上AnswerResult是頻繁讀寫的表,很容易導致這條SQL變成慢查詢。

性能問題被提上日程后,這條SQL語句就變成的優化點。

1、IFNULL()這個函數計算可以調整成冗余字段。

2、LEFT JOIN的迪卡爾乘積太大,可以調整為冗余或者使用INNER JOIN以提高查詢速度。

3、根據需求,其實可以調整出題策略,不同的情況執行不同的SQL,而不需要在同一條SQL中實現。

解決方案針對以上三個點進行調整。雖然Question表有3萬條數據,但是出題的場景其實是針對知識點出題,單個知識點題目最多也只有1000題左右,所以獲取未做過的題目時,完全可以使用NOT IN走索引來完成。SQL語句如:

  A:SELECT 題目標識 FROM Question WHERE 知識點={KnowledgePointCode} AND 題目標識 NOT IN (

    SELECT 題目標識 FROM AnswerResult INNER JOIN Question AND Question.知識點={KnowledgePointCode}

    WHERE AnswerResult.用戶標識 = {UserId}

  )

針對只做錯的題目出題練習就簡單了(正確次數 = 0代表只做錯),SQL如:

  B:SELECT 題目標識 FROM AnswerResult INNER JOIN Question AND Question.知識點={KnowledgePointCode}

  WHERE AnswerResult.用戶標識 = {UserId} AND 正確次數 = 0 ORDER BY 錯誤次數 DESC

若要對做錯、做對或者只做對的題目進行出題,SQL就是這樣的(已經對權重進行冗余=IFNULL((0-正確次數)/(正確次數+錯誤次數),1)):

  C:SELECT 題目標識 FROM AnswerResult INNER JOIN Question AND Question.知識點={KnowledgePointCode}

  WHERE AnswerResult.用戶標識 = {UserId} AND 正確次數 > 0 ORDER BY 權重 DESC

 

不足:SQL語句A的查詢速度依然是較慢的,雖然有縮小NOT IN的結果集,但這里還是有優化點。園子里的朋友們能不能給點建議?

有人說JOIN是SQL的性能殺手,我覺得主要還是怎么去使用JOIN,MySQL的索引優化相當重要,如果JOIN成為性能瓶頸,可以EXPLAIN看看是不是索引沒有建好,并且盡量讓迪卡爾乘積盡量小。使用冗余數據避免JOIN,當可能變化的冗余數據被分表之后,更新這些冗余數據就是一件非常頭痛的事了。海量數據高并發,確實是一件挺頭痛的事。

望園子里有這方面經驗的朋友不吝賜教。謝謝。

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 99免费精品视频 | 黄色电影在线免费观看 | 国产一区二区三区久久久久久久久 | 国产精品久久久久久av下载网址 | 国产一区二区三区在线免费看 | 毛片首页 | 国产成人网 | 二区视频 | 一区二区国产精品 | 久久中文精品 | 国产脚交av在线一区二区 | 17c一起操| 91精品久久久久 | 日韩精品免费在线视频 | 亚洲淫视频 | 香蕉影院在线观看 | 国产日韩精品视频 | 欧美日韩亚洲一区二区三区 | 精品成人国产在线观看男人呻吟 | 欧美一级欧美三级在线观看 | 成人黄色短视频在线观看 | 日韩精品免费在线观看 | 99精品视频在线 | 嫩草在线视频 | 国产视频一二三区 | 欧美天堂 | 日韩精品一区二区三区四区 | 91.成人天堂一区 | 午夜小视频在线观看 | 国产成人精品综合 | 精品亚洲一区二区三区四区五区 | 免费看的毛片 | 国产成人亚洲精品 | 免费不卡视频 | 日韩精品免费一区二区夜夜嗨 | 天天看天天爽 | 国产精品国产a级 | 亚洲精品一 | 国产一区二区精品 | 男女视频网站 | 人人爱人人爽 |