Mysql

Python MySQL 準備語句比正常查詢慢

  • July 10, 2020

我正在嘗試將準備好的語句與 python 一起使用來提高查詢性能,但是我的準備好的語句速度較慢(無論我在基準腳本中設置了多少次迭代,速度都會降低 ~7.5 倍)

這是我寫的一個小基準腳本

本質上,我對正常查詢所做的事情:

cursor = connection.cursor()
cursor.execute("INSERT into test (id,name) VALUES (1,'Value 1')")
... multiple inserts ...
connection.commit()

對於準備好的陳述:

cursor = connection.cursor(prepared=True)
sql = "INSERT into test (id,name) VALUES (%s,%s)"
cursor.execute(sql, (1, 'Value 1'))
... multiple inserts ...
connection.commit()
  • 該腳本以相同的迭代次數執行 2 個循環
  • 第一個循環使用預設值執行,.cursor()而第二個循環.cursor(prepared=True)按上述方式執行

結果如下:

在此處輸入圖像描述

正如你所看到MySQLCursorPrepared=9746msMySQLCursor=1299ms

為什麼我準備好的語句比正常查詢慢?這是pythonmysql.connector驅動程序的問題還是我需要在我的MySQL配置中調整一些東西來解決這個問題?

更快的是建構多行插入:

INSERT INTO t (a,b)
   VALUES
   (1,2),
   (11,23),
   (111,234), ...

在 MySQL 方面,它的執行速度大約是單行插入的 10 倍(對於 100-1000 行)。

我今天被同樣的問題所困擾,而您的問題是唯一出現在相當詳盡(且令人筋疲力盡)的 Google 搜尋中的問題。

無論如何,這就是我發現的。

如果你在同一個游標上執行兩個或多個不同的查詢字元串作為準備好的語句,它會很慢。

在您的基準測試腳本中,您正在執行一個DELETE查詢,然後INSERT在同一個游標上執行五個相同的查詢。這就是導致緩慢的原因。顯然 mysql.connector 不允許你在同一個游標上準備多個查詢字元串,所以當你從它切換DELETEINSERT它時,它會在內部打亂很多東西。當您循環並DELETE再次執行查詢時,也會發生同樣的事情。

要解決此問題,您必須創建多個游標並在其自己的游標上執行每個唯一的查詢字元串。

引用自:https://dba.stackexchange.com/questions/269010