多線程操作mysql數據庫,多線程操作mysql數據庫

本文目錄一覽:

MySQL5.7特性-多線程複製

DATABASE:默認值,基於庫的並行複製方式

LOGICAL_CLOCK:基於組提交的並行複製方式

mysql show variables like “slave_parallel_type”;

mysql show variables like “slave_parallel_workers”;

master_info_repository=TABLE #開啟MTS 功能後,會頻繁更新master.info,設置為TABLE 減小開銷

slave_master_info 記錄了首次同步master 的位置relay_log_recovery=ON (slave IO 線程crash,如果relay‐log損壞,則自動放棄所有未執行的relay‐log,重新從master 上獲取日誌,保證relay‐log 的完整性)

slave_preserve_commit_order=ON 在slave 上應用事務的順序是無序的,和relay log 中記錄的事務順序不一樣,這樣數據一致性是無法保證的,為了保證事務是按照relay log 中記錄的順序來回放,就需要開啟參數slave_preserve_commit_order。

雖然mysql5.7 添加MTS 後,雖然slave 可以並行應用relay log,但commit 部分仍然是順序提交,其中可能會有等待的情況。

要瘋了,怎樣用多線程向MYSQL數據庫中寫入數據

在MySQL 8.0 之前, 我們假設一下有一條爛SQL,

mysqlselect * from t1 order by rand() ;

以多個線程在跑,導致CPU被跑滿了,其他的請求只能被阻塞進不來。那這種情況怎麼辦?

大概有以下幾種解決辦法:

設置max_execution_time 來阻止太長的讀SQL。那可能存在的問題是會把所有長SQL都給KILL 掉。有些必須要執行很長時間的也會被誤殺。

自己寫個腳本檢測這類語句,比如order by rand(), 超過一定時間用Kill query thread_id 給殺掉。

那能不能不要殺掉而讓他正常運行,但是又不影響其他的請求呢?

那mysql 8.0 引入的資源組(resource group,後面簡寫微RG)可以基本上解決這類問題。

比如我可以用 RG 來在SQL層面給他限制在特定的一個CPU核上,這樣我就不管他,讓他繼續運行,如果有新的此類語句,讓他排隊好了。

為什麼說基本呢?目前只能綁定CPU資源,其他的暫時不行。

那我來演示下如何使用RG。

創建一個資源組user_ytt. 這裡解釋下各個參數的含義,

type = user 表示這是一個用戶態線程,也就是前台的請求線程。如果type=system,表示後台線程,用來限制mysql自己的線程,比如Innodb purge thread,innodb read thread等等。

vcpu 代表cpu的邏輯核數,這裡0-1代表前兩個核被綁定到這個RG。可以用lscpu,top等列出自己的CPU相關信息。

thread_priority 設置優先級。user 級優先級設置大於0。

mysqlmysql create resource group user_ytt type = user  vcpu = 0-1 thread_priority=19 enable;Query OK, 0 rows affected (0.03 sec)

RG相關信息可以從 information_schema.resource_groups 系統表裡檢索。

mysqlmysql select * from information_schema.resource_groups;+———————+———————+————————+———-+—————–+| RESOURCE_GROUP_NAME | RESOURCE_GROUP_TYPE | RESOURCE_GROUP_ENABLED | VCPU_IDS | THREAD_PRIORITY |+———————+———————+————————+———-+—————–+| USR_default         | USER                |                      1 | 0-3      |               0 || SYS_default         | SYSTEM              |                      1 | 0-3      |               0 || user_ytt            | USER                |                      1 | 0-1      |              19 |+———————+———————+————————+———-+—————–+3 rows in set (0.00 sec)

我們來給語句select guid from t1 group by left(guid,8) order by rand() 賦予RG user_ytt。

mysql show processlist;+—–+—————–+———–+——+———+——-+————————+———————————————————–+| Id  | User            | Host      | db   | Command | Time  | State                  | Info                                                      |+—–+—————–+———–+——+———+——-+————————+———————————————————–+|   4 | event_scheduler | localhost | NULL | Daemon  | 10179 | Waiting on empty queue | NULL                                                      || 240 | root            | localhost | ytt  | Query   |   101 | Creating sort index    | select guid from t1 group by left(guid,8) order by rand() || 245 | root            | localhost | ytt  | Query   |     0 | starting               | show processlist                                          |+—–+—————–+———–+——+———+——-+————————+———————————————————–+3 rows in set (0.00 sec)

找到連接240對應的thread_id。

mysqlmysql select thread_id from performance_schema.threads where processlist_id = 240;+———–+| thread_id |+———–+|       278 |+———–+1 row in set (0.00 sec)

給這個線程278賦予RG user_ytt。沒報錯就算成功了。

mysqlmysql set resource group user_ytt for 278;Query OK, 0 rows affected (0.00 sec)

當然這個是在運維層面來做的,我們也可以在開發層面結合 MYSQL HINT 來單獨給這個語句賦予RG。比如:

mysqlmysql select /*+ resource_group(user_ytt) */guid from t1 group by left(guid,8) order by rand()….8388602 rows in set (4 min 46.09 sec)

RG的限制:

Linux 平台上需要開啟 CAPSYSNICE 特性。比如我機器上用systemd 給mysql 服務加上

systemctl edit mysql@80 [Service]AmbientCapabilities=CAP_SYS_NICE

mysql 線程池開啟後RG失效。

freebsd,solaris 平台thread_priority 失效。

目前只能綁定CPU,不能綁定其他資源。

怎樣實現多線程訪問MYSQL數據庫

其實最簡單的方法是用timer控件,timer控件本事就是對一個線程的封裝

所以你用兩個timer控件就可以模擬兩個線程了

或者用兩個backgroundworker控件,這個更逼真,不用定時觸發

具體用法,我空間里有教程

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/270519.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-16 13:37
下一篇 2024-12-16 13:37

相關推薦

  • 如何修改mysql的端口號

    本文將介紹如何修改mysql的端口號,方便開發者根據實際需求配置對應端口號。 一、為什麼需要修改mysql端口號 默認情況下,mysql使用的端口號是3306。在某些情況下,我們需…

    編程 2025-04-29
  • Python棧操作用法介紹

    如果你是一位Python開發工程師,那麼你必須掌握Python中的棧操作。在Python中,棧是一個容器,提供後進先出(LIFO)的原則。這篇文章將通過多個方面詳細地闡述Pytho…

    編程 2025-04-29
  • Python 常用數據庫有哪些?

    在Python編程中,數據庫是不可或缺的一部分。隨着互聯網應用的不斷擴大,處理海量數據已成為一種趨勢。Python有許多成熟的數據庫管理系統,接下來我們將從多個方面介紹Python…

    編程 2025-04-29
  • openeuler安裝數據庫方案

    本文將介紹在openeuler操作系統中安裝數據庫的方案,並提供代碼示例。 一、安裝MariaDB 下面介紹如何在openeuler中安裝MariaDB。 1、更新軟件源 sudo…

    編程 2025-04-29
  • Python多線程讀取數據

    本文將詳細介紹多線程讀取數據在Python中的實現方法以及相關知識點。 一、線程和多線程 線程是操作系統調度的最小單位。單線程程序只有一個線程,按照程序從上到下的順序逐行執行。而多…

    編程 2025-04-29
  • Python操作數組

    本文將從多個方面詳細介紹如何使用Python操作5個數組成的列表。 一、數組的定義 數組是一種用於存儲相同類型數據的數據結構。Python中的數組是通過列表來實現的,列表中可以存放…

    編程 2025-04-29
  • Python操作MySQL

    本文將從以下幾個方面對Python操作MySQL進行詳細闡述: 一、連接MySQL數據庫 在使用Python操作MySQL之前,我們需要先連接MySQL數據庫。在Python中,我…

    編程 2025-04-29
  • Python代碼實現迴文數最少操作次數

    本文將介紹如何使用Python解決一道經典的迴文數問題:給定一個數n,按照一定規則對它進行若干次操作,使得n成為迴文數,求最少的操作次數。 一、問題分析 首先,我們需要了解迴文數的…

    編程 2025-04-29
  • Python磁盤操作全方位解析

    本篇文章將從多個方面對Python磁盤操作進行詳細闡述,包括文件讀寫、文件夾創建、刪除、文件搜索與遍歷、文件重命名、移動、複製、文件權限修改等常用操作。 一、文件讀寫操作 文件讀寫…

    編程 2025-04-29
  • 數據庫第三範式會有刪除插入異常

    如果沒有正確設計數據庫,第三範式可能導致刪除和插入異常。以下是詳細解釋: 一、什麼是第三範式和範式理論? 範式理論是關係數據庫中的一個規範化過程。第三範式是範式理論中的一種常見形式…

    編程 2025-04-29

發表回復

登錄後才能評論