myisam innoDB是mysql常用的存儲引擎
MyISAM不支持事務、也不支持外鍵,但其訪問速度快,對事務完整性沒有要求。
InnoDB存儲引擎提供了具有提交、回滾和崩潰恢復能力的事務安全。但是比起MyISAM存儲引擎,InnoDB寫的處理效率差一些並且會占用更多的磁盤空間以保留數據和索引。
innodb的索引有兩種,叫第一索引,以及第二索引。有的也叫聚集索引與輔助索引。其中聚集索引存放了表中的記錄,查詢的時候不需要回表掃描,同時索引項較大;輔助索引存放的位置信息,需要回表掃描,相對來說,I/0 次數會增加。
查詢的時候最好能夠從索引中取得數據,減少回表,相對來說離散的 I/0,
MYISAM 沒有聚集索引。存放的記錄的物理位置
OLTP (聯機事務處理)故名思議主要強調事務,如(銀行存款的修改,用戶訂單等)面向應用
OLAP (聯機分析處理) 主要作為數據倉庫,面向決策,分析等。
聯接算法:
nested-loops join 主要思想是:從外表中拿出一個數據與內表的每一條數據比較,O(M*N) 。當有索引時:內表只需要比較索引的高度,近似於O(M*H)
Block nested--loops join 主要思想 是:改進 nested-loops join 外部表每次去一定的數據到緩沖區,比如10條,然後這10條記錄在跟內部表的數據比較,減少內部表的掃描次數。
Hash join 只能== 以及!=,不能部分比較(為何?,hash是對整個字符串hash) 主要思想是:將外部表的數據放到join buffer,然後hash,這一階段
為build;probe階段,從內表中取出數據hash,比較。
基本的測試:
create TABLE myorder
( id int not null auto_increment,
userid int not null ,
orderdate date,
comein int DEFAULT 0,
comeout int DEFAULT 0,
PRIMARY key (id)
);
INSERT into myorder VALUES("","11123940","2014-05-10","","50");
SELECT userid ,orderdate ,comein -comeout as rest
from myorder
GROUP BY userid ,orderdate;
create index myorderindex on myorder(id,userid);
explain SELECT userid ,orderdate ,comein -comeout as rest
from myorder
GROUP BY userid ,orderdate;