2016-02-16 177 views
0

現在我們正在使用MySQL版本5.1.72數據庫。這不是一個集羣數據庫,而是一個普通數據庫。 64位(「使用readline 6.3」for sun-solaris2.11(x86_64)「的MySQL Ver 14.14 Distrib 5.1.72)我們使用的是專用服務器,而不是冗餘雲解決方案。我曾經歷了更多的客戶,我們擠不進我們的平臺,更多的問題與我們選擇數據庫

2016-02-15 13:26:36,737 WARN [org.hibernate.util.JDBCExceptionReporter] - <SQL Error: 1205, SQLState: 41000> 
2016-02-15 13:26:36,737 ERROR [org.hibernate.util.JDBCExceptionReporter] - <Lock wait timeout exceeded; try restarting transaction> 
javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: could not insert: [com.marin.core.server.model.TableName] 

能切換到另一個數據庫中獲取幫助我們?或者,也許只是MySQL的羣集版本?一些表格中有數百萬行。最大的桌子大小約爲5 GB。它有很多指數。

回答

0

通常那樣的問題是由於

  • 不足索引。通常這是因爲對單列進行索引並且未能使用「組合」索引來獲得更好的優勢。
  • 龐大的數據導致額外的I/O(這是任何查詢的緩慢部分)。這可以通過更仔細地選擇數據類型和/或規範化來彌補。
  • 無效查詢 - 有一些已知效率低下的構造,可以重新配置以獲得性能的顯着提升。

建議您設置long_query_time=1並打開緩慢日誌。然後等待一天,然後運行mysqldumpslow -s tpt-query-digest以查明長時間運行的情況。 (注意:特定的超時時間通常表現爲查詢花費幾乎50秒。)

然後讓我們看看查詢和SHOW CREATE TABLE,修復它們並教導用戶如何避免重複出現問題。

+0

但是,如果您有一個自動增加的單列主鍵,它將始終有一個索引。 –

+0

只有當您具有用於查找的「id」時,該索引纔有用。相反,如果你需要通過'name'獲取,'id'沒有用處。 –

+0

許多表都有一個複合PK,但很多都有一個自動增加的單列PK。還有一些其他單列的指標不屬於PK的一部分。 –