本文主要講述了如何加速動態網站的MySQL索引分析和優化
一什麼是索引?
索引用來快速地尋找那些具有特定值的記錄所有MySQL索引都以B樹的形式保存如果沒有索引執行查詢時MySQL必須從第一個記錄開始掃描整個表的所有記錄直至找到符合要求的記錄表裡面的記錄數量越多這個操作的代價就越高如果作為搜索條件的列上已經創建了索引MySQL無需掃描任何記錄即可迅速得到目標記錄所在的位置如果表有個記錄通過索引查找記錄至少要比順序掃描記錄快倍
假設我們創建了一個名為people的表
CREATE TABLE people ( peopleid SMALLINT NOT NULL
name CHAR() NOT NULL );
然後我們完全隨機把個不同name值插入到people表在數據文件中name列沒有任何明確的次序如果我們創建了name列的索引MySQL將在索引中排序name列對於索引中的每一項MySQL在內部為它保存一個數據文件中實際記錄所在位置的指針因此如果我們要查找name等於Mike記錄的peopleid(SQL命令為SELECT peopleid FROM people WHERE name=Mike;)MySQL能夠在name的索引中查找Mike值然後直接轉到數據文件中相應的行准確地返回該行的peopleid()在這個過程中MySQL只需處理一個行就可以返回結果如果沒有name列的索引MySQL要掃描數據文件中的所有記錄即個記錄!顯然需要MySQL處理的記錄數量越少則它完成任務的速度就越快
二索引的類型
MySQL提供多種索引類型供選擇
普通索引
這是最基本的索引類型而且它沒有唯一性之類的限制普通索引可以通過以下幾種方式創建
創建索引例如CREATE INDEX <索引的名字> ON tablename (列的列表);
修改表例如ALTER TABLE tablename ADD INDEX [索引的名字] (列的列表);
創建表的時候指定索引例如CREATE TABLE tablename ( [] INDEX [索引的名字] (列的列表) );
唯一性索引
這種索引和前面的普通索引基本相同但有一個區別索引列的所有值都只能出現一次即必須唯一唯一性索引可以用以下幾種方式創建
創建索引例如CREATE UNIQUE INDEX <索引的名字> ON tablename (列的列表);
修改表例如ALTER TABLE tablename ADD UNIQUE [索引的名字] (列的列表);
創建表的時候指定索引例如CREATE TABLE tablename ( [] UNIQUE [索引的名字] (列的列表) );
主鍵
主鍵是一種唯一性索引但它必須指定為PRIMARY KEY如果你曾經用過AUTO_INCREMENT類型的列你可能已經熟悉主鍵之類的概念了主鍵一般在創建表的時候指定例如CREATE TABLE tablename ( [] PRIMARY KEY (列的列表) ); 但是我們也可以通過修改表的方式加入主鍵例如ALTER TABLE tablename ADD PRIMARY KEY (列的列表); 每個表只能有一個主鍵
全文索引
MySQL從版開始支持全文索引和全文檢索在MySQL中全文索引的索引類型為FULLTEXT全文索引可以在VARCHAR或者TEXT類型的列上創建它可以通過CREATE TABLE命令創建也可以通過ALTER TABLE或CREATE INDEX命令創建對於大規模的數據集通過ALTER TABLE(或者CREATE INDEX)命令創建全文索引要比把記錄插入帶有全文索引的空表更快
From:http://tw.wingwit.com/Article/program/PHP/201311/21395.html