1. 程式人生 > >Monty說MySQL的優化(七)

Monty說MySQL的優化(七)

三十一、事務的例子

MyIASM表如何進行事務處理:
mysql> LOCK TABLES trans READ, customer WRITE;
mysql> select sum(value) from trans where customer_id=some_id;
mysql> update customer set total_value=sum_from_previous_statement
where customer_id=some_id;
mysql> UNLOCK TABLES;
BDB表如何進行事務:
mysql> BEGIN WORK;
mysql> select sum(value) from trans where customer_id=some_id;
mysql> update customer set total_value=sum_from_previous_statement
where customer_id=some_id;
mysql> COMMIT;
注意你可以通過下列語句迴避事務:
UPDATE customer SET value=value+new_value WHERE customer_id=some_id;

三十二、使用REPLACE的例子



REPLACE的功能極像INSERT,除了如果一條老記錄在一個唯一索引上具有與新紀錄相同的值,那麼老記錄在新紀錄插入前則被刪除。不使用 SELECT 1 FROM t1 WHERE key=#
IF found-row
LOCK TABLES t1
DELETE FROM t1 WHERE key1=#
INSERT INTO t1 VALUES (...)
UNLOCK TABLES t1;
ENDIF
而用
REPLACE INTO t1 VALUES (...)

三十三、一般技巧

使用短主鍵。聯結表時使用數字而非字串。
當使用多部分鍵碼時,第一部分應該時最常用的部分。
有疑問時,首先使用更多重複的列以獲得更好地鍵碼壓縮。
如果在同一臺機器上執行MySQL客戶和伺服器,那麼在連線MySQL時則使用套接字而不是TCP/IP(這可以提高效能7.5%)。可在連線MySQL伺服器時不指定主機名或主機名為localhost來做到。
如果可能,使用--skip-locking(在某些OS上為預設),這將關閉外部鎖定並將提高效能。
使用應用層雜湊值而非長鍵碼:
SELECT * FROM table_name WHERE hash=MD5(concat(col1,col2)) AND
col_1='constant' AND col_2='constant'
在檔案中儲存需要以檔案形式訪問的BLOB,在資料庫
中只儲存檔名。
刪除所有行比刪除一大部分行要快。
如果SQL不夠快,研究一下訪問資料的較底層介面。

三十四、使用MySQL 3.23的好處

MyISAM:可移植的大表格式
HEAP:記憶體中的表
Berkeley DB:支援事務的表。
眾多提高的限制
動態字符集
更多的STATUS變數
CHECK和REPAIR表
更快的GROUP BY和DISTINCT
LEFT JOIN ... IF NULL的優化
CREATE TABLE ... SELECT
CREATE TEMPORARY table_name (...)
臨時HEAP表到MyISAM表的自動轉換
複製
mysqlhotcopy指令碼

三十五、正在積極開發的重要功能


改進事務處理
失敗安全的複製
正文搜尋
多個表的刪除(之後完成多個表的更新)
更好的鍵碼快取
原子RENAME (RENAME TABLE foo as foo_old, foo_new as foo)
查詢快取記憶體
MERGE TABLES
一個更好的GUI客戶程式