程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> Monty說MySQL的優化(五)

Monty說MySQL的優化(五)

編輯:MySQL綜合教程

本文是Monty在O'Reilly Open Source Convention 2000大會上的演講之五,涉及MySQL表高速緩存工作原理、MySQL擴展/優化-提供更快的速度、MySQL何時使用索引、學會使用 EXPLAIN、使用SHOW PROCESSLIST五個方面,是篇詳盡的MySQL優化文檔

二十一、MySQL表高速緩存工作原理

每個MyISAM表的打開實例(instance)使用一個索引文件和一個數據文件。如果表被兩個線程使用或在同一條查詢中使用兩次,MyIASM將共享索引文件而是打開數據文件的另一個實例。
如果所有在高速緩存中的表都在使用,緩存將臨時增加到比表緩存尺寸大些。如果是這樣,下一個被釋放的表將被關閉。
你可以通過檢查mysqld的Opened_tables變量以檢查表緩存是否太小。如果該值太高,你應該增大表高速緩存。
 
二十二、MySQL擴展/優化-提供更快的速度

使用優化的表類型(HEAP、MyIASM或BDB表)。
對數據使用優化的列。
如果可能使用定長行。
使用不同的鎖定類型(SELECT HIGH_PRIORITY,INSERT LOW_PRIORITY)
Auto_increment
REPLACE (REPLACE INTO table_name VALUES (...))
INSERT DELAYED
LOAD DATA INFILE / LOAD_FILE()
使用多行INSERT一次插入多行。
SELECT INTO OUTFILE
LEFT JOIN, STRAIGHT JOIN
LEFT JOIN ,結合IS NULL
ORDER BY可在某些情況下使用鍵碼。
如果只查詢在一個索引中的列,將只使用索引樹解決查詢。
聯結一般比子查詢快(對大多數SQL服務器亦如此)。
LIMIT
SELECT * from table1 WHERE a > 10 LIMIT 10,20
DELETE * from table1 WHERE a > 10 LIMIT 10
foo IN (常數列表) 高度優化。
GET_LOCK()/RELEASE_LOCK()
LOCK TABLES
INSERT和SELECT可同時運行。
UDF函數可裝載進一個正在運行的服務器。
壓縮只讀表。
CREATE TEMPORARY TABLE
CREATE TABLE .. SELECT
帶RAID選項的MyIASM表將文件分割成很多文件以突破某些文件系統的2G限制。
Delay_keys
復制功能

二十二、MySQL何時使用索引

對一個鍵碼使用>, >=, =, 1 and key_part1 < 90
如果使用HEAP表且不用=搜索所有鍵碼部分。
在HEAP表上使用ORDER BY。
如果不是用鍵碼第一部分

SELECT * FROM table_name WHERE key_part2=1
如果使用以一個通配符開始的LIKE

SELECT * FROM table_name WHERE key_part1 LIKE '%jani%'
搜索一個索引而在另一個索引上做ORDER BY

SELECT * from table_name WHERE key_part1 = # ORDER BY key2

二十四、學會使用EXPLAIN

對於每一條你認為太慢的查詢使用EXPLAIN!

mysql> explain select t3.DateOfAction, t1.TransactionID
-> from t1 join t2 join t3
-> where t2.ID = t1.TransactionID and t3.ID = t2.GroupID
-> order by t3.DateOfAction, t1.TransactionID;
+-------+--------+---------------+---------+---------+------------------+------+---------------------------------+
| table | type | possible_keys | key | key_len | ref | rows | Extra |
+-------+--------+---------------+---------+---------+------------------+------+---------------------------------+
| t1 | ALL | NULL | NULL | NULL | NULL | 11 | Using temporary; Using filesort |
| t2 | ref | ID | ID | 4 | t1.TransactionID | 13 | |
| t3 | eq_ref | PRIMARY | PRIMARY | 4 | t2.GroupID | 1 | |
+-------+--------+---------------+---------+---------+------------------+------+---------------------------------+
ALL和范圍類型提示一個潛在的問題。
 
二十五、學會使用SHOW PROCESSLIST

使用SHOW processlist來發現正在做什麼:
+----+-------+-----------+----+---------+------+--------------+-------------------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-------+-----------+----+---------+------+--------------+-------------------------------------+
| 6 | monty | localhost | bp | Query | 15 | Sending data | select * from station,station as s1 |
| 8 | monty | localhost | | Query | 0 | | show processlist |
+----+-------+-----------+----+---------+------+--------------+-------------------------------------+
在mysql或mysqladmin中用KILL來殺死溜掉的線程。

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