优化原则:小表驱动大表,即小的数据集驱动大的数据集。
############# 原理 (RBO) #####################
1 2 3 4 | select * from A where id in ( select id from B) 等价于: for select id from B for select * from A where A.id = B.id |
当B表的数据集必须小于A表的数据集时,用in优于exists。
1 2 3 4 | select * from A where exists ( select 1 from B where B.id = A.id) 等价于 for select * from A for select * from B where B.id = A.id |
当A表的数据集系小于B表的数据集时,用exists优于in。
注意:A表与B表的ID字段应建立索引。
例如:
1 2 3 4 | /** 执行时间:0.313s **/ SELECT SQL_NO_CACHE * FROM rocky_member m WHERE EXISTS ( SELECT 1 FROM rocky_vip_appro a WHERE m.ID = a.user_id AND a.passed = 1); /** 执行时间:0.160s **/ SELECT SQL_NO_CACHE * FROM rocky_member m WHERE m.ID in ( SELECT ID FROM rocky_ |
mysql存储
创建一个存储p1()
1 2 3 4 5 6 7 8 9 10 | mysql> \d // mysql> create procedure p1() -> begin -> set @i=0; -> while @i<10 do -> select @i; -> set @i=@i+1; -> end while ; -> end; -> // |
执行存储p1()
1 2 3 4 5 6 | mysql> \d ; mysql> call p1(); --查看procedure p1()的status信息 mysql> show procedure status\G --查看procedure p1()的具体信息: mysql> show create procedure p1\G |
mysql触发器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | 修改delimiter为 // mysql> \d // 创建一个名字为tg1的触发器,当向t1表中插入数据时,就向t2表中插入一条数据 mysql> create trigger tg1 before insert on t1 for each ro >begin >insert into t2( id ) values(new. id ); >end // --准备两个空表t1和t2 mysql> select * from t1; mysql> select * from t2; --向t1表中插入多条数据: mysql> insert into t1 values(1),(2),(3),(4); 如何制作删除表t1后t2表中的记录也会跟着删除呢 mysql>\d // mysql> create trigger tg2 beforedelete on t1 for each row >begin delete from t2 where id =old. id ; >end // mysql>\d ; 如何制作更改表t1后t2表中的记录跟着个性呢 mysql>\d // mysql> create trigger tg3 beforeupdate on t1 for each row >begin update t2 set id =new. id where id =old. id ; >end // mysql>\d ; 查看触发器 mysql> show triggers; |
本文出自 “cruisezhao” 博客,请务必保留此出处http://132408.blog.51cto.com/122408/1738665
原文:http://132408.blog.51cto.com/122408/1738665