一般的查询加载
1.查詢重寫技術(shù)
? ?1 不要引用索引列在一個表達式。這樣將阻止使用索引列。代替是應(yīng)該在比較的邊使用盡可能的。加入一個表t包含一個date ?d列。 如下
select * from t where year>=1884代替使用select * from t where d>='1994-01-01';
? 2.索引是特別有用的對于連接比較兩個表中的列如下:
? ?select* from country,countrylanguage
? where country.code=countrylanguage.countrycode;
3.當使用索引是采用和列相同的數(shù)據(jù)類型
? ? where id=18
? ? where id='18'
4.在某種情況下,可以使用模式匹配,開始是字母時很有效
23.3.2 使用explain來獲得優(yōu)化信息
explain select* from t where year >=1994\G
explain select* from t where d>='1994-o1-01'\G可以看到減少了查詢了行
22.3.3 優(yōu)化查詢通過限制輸出
? ?limit限制輸出
對于特別大的表如果要取出幾行,使用limit并不能達到很好的效果。使用where很好
22.3.4 使用summary表
22.3.5 優(yōu)化更新
? 1.盡量使用where語句,在比較時使用索引
? ?2.explain被使用select查詢,但是你可能發(fā)現(xiàn)它是有用分析update和delete語句。
? ?3.使用多行的插入代替多個單行的插入
如果你正在使用InnoDB表,你可以得到更好的性能通過分組他們在一個transaction而不是執(zhí)行他們自動提交
? ?4.對于存儲引擎,load data infile是更快比多行插入
? ? 5.可以disable index,當加載元素進入一個空的myisam表時來加速操作。
? ? ?6.為了替代存在的行,使用replace而不是delete+insert
22.4 選擇恰當?shù)拇鎯σ?/p>
當創(chuàng)建一個表時,詢問你自己那種類型的查詢你正在使用。任何選擇一個存儲引擎。當需要處理查詢和很多更新是使用INNoDB引擎。如果你正在使用MyISAM表,選擇他們的結(jié)構(gòu)來反映是否你考慮處理速度的效率或磁盤的使用率。不同的MYISAM存儲跟上有不同的性能的特征。這影響你選擇固定長度或可變長度的列來存儲字符數(shù)據(jù):
? ?1.使用固定的列入(CHAR,Binary)為了更好的加速
? ?2.使用可變長度的列入(varchar,varvinary text ,blob)為了更好使用磁盤空間。
另外使用MyISAM引擎的表被用來使用壓縮的可讀表。
對于INnodb,它是也是正確的使用Char列將花費更多的存儲空間比varchar。但是沒有額外的加速相比MyISAM,因為InnoDB引擎的實現(xiàn)存儲對于char和varchar是相似的。
MeRGE表能夠使用壓縮和非壓縮表的混合。這能偶使有用的對于基于時間紀錄的。例如,你例如日志紀錄,對于當前年的表可以使用非壓縮的表,對于以前的日志使用壓縮表。如果創(chuàng)建merge表來自collection,可以很容查詢所有的表。
他將多個表在邏輯上當作一個表來查詢。他建立后有兩個文件,
.frm 表結(jié)構(gòu)定義
.mrg union表的名字清單
兩個基本表:
CREATE TABLE TEST_MERGE_1(
ID INT(5) NOT NULL,
VALUE VARCHAR(100) NOT NULL,
PRIMARY KEY(ID)
)
CREATE TABLE TEST_MERGE_2(
ID INT(5) NOT NULL,
VALUE VARCHAR(100) NOT NULL,
PRIMARY KEY(ID)
)?
MERGE表的建立:
CREATE TABLE TEST_MERGE(
ID INT(5) NOT NULL,
VALUE VARCHAR(100) NOT NULL,
PRIMARY KEY(ID)
) TYPE=MERGE UNION=(TEST_MERGE_1,TEST_MERGE_2) INSERT_METHOD=LAST;
1. 此表類似于SQL中的union機制。
2. 此表結(jié)構(gòu)必須與基本表完全一致,包括列名、順序。UNION表必須同屬一個DATABASE。
3. 基本表類型必須是MyISAM。
4. 可以通過修改.mrg文件來修改MERGE表,每個基本表的名字占一行。注意:修改后要通過FLUSH TABLES刷新表緩存。
5. 對基本表的更改可以直接反映在此表上。
6. INSERT_METHOD的取值可以是: 0 不允許插入 FIRST 插入到UNION中的第一個表 LAST 插入到UNION中的最后一個表。(4.0之后可用)
7. 定義在它上面的約束沒有任何作用,約束是由基本表控制的,例如兩個基本表中存在著同樣的一個Key值,那么在MERGE表中會有兩個一樣的Key值。
總結(jié)