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

Monty說MySQL的優化(五)

編輯:關於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