對一個(gè)鍵碼使用>, >=, =, <, <=, IF NULL和BETWEEN SELECT * FROM table_name WHERE key_part1=1 and key_part2 > 5; SELECT * FROM table_name WHERE key_part1 IS NULL;
當使用不以通配符開(kāi)始的LIKE SELECT * FROM table_name WHERE key_part1 LIKE ‘jani%‘
在進(jìn)行聯(lián)結時(shí)從另一個(gè)表中提取行時(shí) SELECT * from t1,t2 where t1.col=t2.key_part
找出指定索引的MAX()或MIN()值 SELECT MIN(key_part2),MAX(key_part2) FROM table_name where key_part1=10
一個(gè)鍵碼的前綴使用ORDER BY或GROUP BY SELECT * FROM foo ORDER BY key_part1,key_part2,key_part3
在所有用在查詢(xún)中的列是鍵碼的一部分時(shí)間 SELECT key_part3 FROM table_name WHERE key_part1=1
內部表鎖定 LOCK TABLES(所有表類(lèi)型適用) GET LOCK()/RELEASE LOCK() 頁(yè)面鎖定(對BDB表) ALTER TABLE也在BDB表上進(jìn)行表鎖定 LOCK TABLES允許一個(gè)表有多個(gè)讀者和一個(gè)寫(xiě)者。 一般WHERE鎖定具有比READ鎖定高的優(yōu)先級以避免讓寫(xiě)入方干等。對于不重要的寫(xiě)入方,可以使用LOW_PRIORITY關(guān)鍵字讓鎖定處理器優(yōu)選讀取方。 UPDATE LOW_PRIORITY SET value=10 WHERE id=10;
MyIASM表如何進(jìn)行事務(wù)處理: 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表如何進(jìn)行事務(wù): 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;
注意你可以通過(guò)下列語(yǔ)句回避事務(wù): UPDATE customer SET value=value+new_value WHERE customer_id=some_id;
使用短主鍵。聯(lián)結表時(shí)使用數字而非字符串。 當使用多部分鍵碼時(shí),第一部分應該時(shí)最常用的部分。 有疑問(wèn)時(shí),首先使用更多重復的列以獲得更好地鍵碼壓縮。 如果在同一臺機器上運行MySQL客戶(hù)和服務(wù)器,那么在連接MySQL時(shí)則使用套接字而不是TCP/IP(這可以提高性能7.5%)??稍谶B接MySQL服務(wù)器時(shí)不指定主機名或主機名為localhost來(lái)做到。 如果可能,使用--skip-locking(在某些OS上為默認),這將關(guān)閉外部鎖定并將提高性能。 使用應用層哈希值而非長(cháng)鍵碼: SELECT * FROM table_name WHERE hash=MD5(concat(col1,col2)) AND col_1=‘constant‘ AND col_2=‘constant‘