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;