mysql与oracle的各自适用的场景分别是什么,下面的内容主要再查询转换上进行下比较。先总结下,基本上mysql是不适用于复杂的查询的,哪怕是稍微复杂的查询,在我别的blog中记载了写mysql的sql优化案例也可以看出来。mysql 查询上主要是用在一些简单查询的场景下,关于mysql的事务隔离级别及锁的研究,后续会在写一篇blog,在事务隔离级别和锁的测试中可以看到在mysql的默认隔离级别下,主要的适用场景是大量的简单查询,少量更新的情况,很适合互联网,互联网的大部分业务场景中基本读写比在4比1或更高,查询函数上也是oracle完全占优势,完整大量的分析函数为报表提供了便捷,而对oracle来说,适用的场景很广泛,基本对于任何的场景都可以适用
子查询展开
oracle中有2中策略展开,1 生成内联视图,2展开子查询合并到外层查询中,第二个是命令式的,第一个是基于成本的
对于mysql来说,子查询也是类似,下面第一个是物化了一个视图,因为子查询和外层没有什么关系,第二个是与外层关联了
mysql@t>explain select * from big_table where exists(select 1 from small_table where big_table.table_name=small_table.table_name );
±—±-------------------±------------±-----±---------------±---------------±--------±--------------------------±-------±------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
±—±-------------------±------------±-----±---------------±---------------±--------±--------------------------±-------±------------+
| 1 | PRIMARY | big_table | ALL | NULL | NULL | NULL | NULL | 902397 | Using where |
| 2 | DEPENDENT SUBQUERY | small_table | ref | idx_table_name | idx_table_name | 194 | test.big_table.TABLE_NAME | 5 | Using index |
±—±-------------------±------------±-----±---------------±---------------±--------±--------------------------±-------±------------+
2 rows in set (0.01 sec)
mysql@test>explain extended select * from big_table where exists(select 1 from small_table where big_table.table_name=small_table.table_name );
±—±-------------------±------------±-----±---------------±---------------±--------±--------------------------±-------±---------±------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
±—±-------------------±------------±-----±---------------±---------------±--------±--------------------------±-------±---------±------------+
| 1 | PRIMARY | big_table | ALL | NULL | NULL | NULL | NULL | 902397 | 100.00 | Using where |
| 2 | DEPENDENT SUBQUERY | small_table | ref | idx_table_name | idx_table_name | 194 | test.big_table.TABLE_NAME | 5 | 100.00 | Using index |
±—±-------------------±------------±-----±---------------±---------------±--------±--------------------------±-------±---------±------------+
连接消除
对于下面的一些查询关联是可以消除掉的,就是直接查看一个表就行了,没有必要2个表关联,在o中能消除,但是在mysql中是没有消除的,第一个查询中xiaodi的dage_id外键关联dage的id,对于下面的查询来说,其实就是直接查询xiaodi的表,所以可以消除与dage的关联,对第二个查询,因为是查看的左外关联中左边表的列,所以直接查找左面的表就行了,也没必要关联
mysql@.test>explain extended select x.id,x.name from xiaodi x ,dage d where x.dage_id=d.id;
±—±------------±------±-------±--------------±--------±--------±---------------±-----±---------±------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
±—±------------±------±-------±--------------±--------±--------±---------------±-----±---------±------------+
| 1 | SIMPLE | x | ALL | dage_id | NULL | NULL | NULL | 1 | 100.00 | Using where |
| 1 | SIMPLE | d | eq_ref | PRIMARY | PRIMARY | 4 | test.x.dage_id | 1 | 100.00 | Using index |
±—±------------±------±-------±--------------±--------±--------±---------------±-----±---------±------------+
2 rows in set, 1 warning (0.00 sec)
mysql@test>show warnings;
±------±-----±------------------------------------------------------------------------------------------------------------