三十一、事務的例子
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客戶程序