程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> 關於MYSQL數據庫 >> mysql一些經驗總結

mysql一些經驗總結

編輯:關於MYSQL數據庫

1 開啟事務之前需要rollback 連接句柄。(清理垃圾)
2 MySQL_ping 失敗,程序需要處理重連邏輯;
3 mysql_query()執行的SQL語句是一個以‘\0’結尾的字符串,而MySQL_real_query()執行的字符串長度是參數指定的,因此,前者不能不能包含二進制數據(二進制數據中可能會包含‘\0’,導致被認為到達字符串末尾)
實際使用中,推薦使用MySQL_real_query
4 MySQL C API   中SQL不需要 ';' 結尾;
5 MySQL 轉義;(老問題了)
6 所有update 語句,建議後邊調用函數判斷受影響的行數,是否是自己預期值;
7 MySQL_real_connect 需要設置連接超時時間,特別是處理重連邏輯的時候,以免程序堵死;
8 程序rollback時候, 需要習慣性的校驗應用的錯誤碼,避免錯誤碼沒有賦值,調用者以為調用成功,造成漏洞;
9 多線程環境下使用libmysqlclIEnt_r 庫,非libMySQLclIEnt 庫
10 mysql_real_connect/MySQL_init 多線程環境下調用需要加鎖;
11 使用MySQL_real_escape_string, 需要注意目標緩沖區是 2*n+1 大小;
12 MySQL_store_result 這個函數是分配的內存的。 使用完需要釋放,避免內存洩露;

13 MySQL的事務盡量小,使用完,立即commit或rollback.不要起一個過大的事務。
14 MySQL的隔離級別注意使用 Read Commited。不然會產生鎖間隙的問題。
15 避免嘗試去鎖一個不存在的記錄,for update語句where條件請使用主鍵(鎖定一個非主鍵,會默認同時鎖定一個主鍵,這是造成很多死鎖的原因)。避免過多的for update。
16 select語句必須使用索引,where條件避免使用 or 或者在條件中運用運算表達式,會造成索引失效。
17 聯合索引可以替代單獨的索引。如果已有聯合索引,不需要重復建立單獨的索引。索引過多會導致插入變慢。注意是聯合索引的第一個可以省略。 避過(f1,f2),可以省略f1的單獨索引,但是不能省略f2的單獨索引。
18 where條件,結果集不要太大,如果超過30%,索引會時效,會導致MySQL掃描全表。不確定時,請用explain做檢測。
19 MySQL單表記錄保持在1000W以下,以獲得較好的性能。
20 MySQL數據庫鏈接數不能過多,請保持在200以下。
21 修改MySQL 鎖等待時間,默認為50s,避免for update等待時間超長,造成系統阻塞 innodb_lock_wait_timeout(修改這個屬性需要重啟數據庫)
22 如果啟用事務,可以不必顯示的設置set autocommit=0,即使當時autocommit模式為1(直接提交模式),可以通過begin/commit來隱式的調用。
   如果不使用事務,則必須顯示的調用 set autocommit=1.因為不能確定,是否某長鏈接中,有人設置了set autocommit=0. (事務性,單條sql也最好顯式開啟事務)

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved