第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

提高涉及聯(lián)合的 MYSQL QUERY 的性能

提高涉及聯(lián)合的 MYSQL QUERY 的性能

Go
哆啦的時光機 2023-06-26 17:00:14
擁有一個 Golang 實用程序,能夠減少包含歷史數(shù)據(jù)的表中每天的數(shù)據(jù)點。記錄范圍為每天 20 到 400 條記錄。總共至少有1億條記錄。該實用程序能夠在給定日期之前將其減少到每天 n 條記錄。(n 的范圍可以是每天 1 到 300 條記錄)我使用的方法如下:步驟1:創(chuàng)建表 main_table_tmp 像 main_table;第2步:更改表 main_table_tmp 添加列 timekey INT;步驟 3:INSERT INTO main_table_tmp SELECT * FROM (  SELECT *,FLOOR(UNIX_TIMESTAMP(column_name)/((1440/2)*60)) AS timekey   FROM main_table  WHERE column_name <= '2018-01-01'   GROUP BY timekey) m UNION ALL (SELECT * ,0 As timekey FROM main_table where column_name > 'date') ;步驟4:更改表 main_table_tmp 刪除列時間鍵;DROP TABLE 維護表;將表 maintable_tmp 重命名為 maintable;我正在使用 golang 實現(xiàn)上述目標。func somefuncname(){  ----   ----  ----  q := "CREATE TABLE " + *tablename + "_tmp LIKE " + *tablename + ";"  rows, err := db.Query(q)  if err != nil {  fmt.Println(err)  }//--ALTER ADD timekey//--INSERT INTO SELECT *....//--ALTER DROP timekey ,DROP table and rename}當前該查詢的響應時間非常慢部分結(jié)果: 總記錄: 200 萬條執(zhí)行時間: 180 秒這是在 16Gb RAM CPU 上部署在低等級系統(tǒng)上時非常慢我為解決此問題所采取的步驟:查看了所有表的索引。嘗試刪除索引并運行該實用程序。刪除索引使實用程序加快了 5 秒,但這也不算多。分階段執(zhí)行實用程序:如果總記錄超過 100 萬條,則一次運行 100 萬條實用程序但畢竟這些努力看起來主要問題在于查詢本身。只是速度不夠快。我只是需要一種方法來提高查詢效率任何幫助表示贊賞,謝謝大家?。?
查看完整描述

1 回答

?
人到中年有點甜

TA貢獻1895條經(jīng)驗 獲得超7個贊

為什么我們先添加timekey然后刪除它?將其添加到空表中速度很快,但是在填充后將其從表中刪除,這就像表的額外副本。如果我們不需要的話,那是不必要的工作。


我們可以GROUP BY對表達式執(zhí)行 a;該表達式不必出現(xiàn)在 SELECT 列表中,例如:


SELECT t.*

  FROM main_table t

 WHERE t.column_name <= '2018-01-01'

 GROUP 

    BY FLOOR(UNIX_TIMESTAMP(t.column_name)/((1440/2)*60))

ONLY_FULL_GROUP_BY(請注意,如果包含在 sql_mode 中,此查詢將導致錯誤;這將禁用允許查詢運行的 MySQL 特定擴展。)


如果沒有一些表定義(包括存儲引擎、列數(shù)據(jù)類型、索引)并且沒有 EXPLAIN 輸出,我們只是猜測。


但一些建議:


刪除正在填充的空表上的二級索引,并在表加載后添加它們。


我會避開工會。鑒于其中一個 SELECT 語句有一個謂詞,column_name而另一個 SELECT 語句有一個完全不同的列上的謂詞date,我們確實希望分隔 SELECT 語句。


CREATE TABLE main_table_tmp LIKE main_table

;


-- for performance, remove secondary indexes, leave just the cluster index

ALTER TABLE main_table_tmp 

    DROP INDEX noncluster_index_1

  , DROP INDEX noncluster_index_2

  , ...

;


-- for performance, have a suitable index available on main_table 

-- with `column_name` as the leading column

INSERT INTO main_table_tmp 

SELECT h.*

  FROM main_table h

 WHERE h.column_name <= '2018-01-01'

 GROUP 

    BY FLOOR(UNIX_TIMESTAMP(h.column_name)/((1440/2)*60))

;


-- for performance, have a suitable index available on main_table

-- with `date` as the leading column

INSERT INTO main_table_tmp

SELECT c.*

  FROM main_table

 WHERE c.date > '????-??-??'

;


-- add secondary indexes 

ALTER TABLE maint_table_tmp

    ADD UNIQUE INDEX noncluster_index_1 (fee,fi,fo)

  , ADD INDEX noncluster_index_2 (fum)

  , ...

;


查看完整回答
反對 回復 2023-06-26
  • 1 回答
  • 0 關(guān)注
  • 146 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號