内部表锁定 LOCK TABLES(所有表类型适用) GET LOCK()/RELEASE LOCK() 页面锁定(对BDB表) ALTER TABLE也在BDB表上进行表锁定 LOCK TABLES允许一个表有多个读者和一个写者。 一般WHERE锁定具有比READ锁定高的优先级以避免让写入方干等。对于不重要的写入方,可以使用LOW_PRIORITY关键字让锁定处理器优选读取方。 UPDATE LOW_PRIORITY SET value=10 WHERE id=10;
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;
使用短主键。联结表时使用数字而非字符串。 当使用多部分键码时,第一部分应该时最常用的部分。 有疑问时,首先使用更多重复的列以获得更好地键码压缩。 如果在同一台机器上运行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'