简单的区别记录

一.oracle 与 MySQL

  1.oracle收费、MySQL开源

  2.oracle是大型数据库,支持高并发操作,一张表通过表分区可以存储千万级数据量,创建合适的索引后依然可以读写快速。MySQL小型数据库,数据量大的话,通过使用分库分表的机制来提高读写效率

  3.oracle不支持主键自动增长。MySQL支持主键自动增长

  4.安装后使用空间也有很大区别,oracle安装完后又3G多,然而MySQL只需要150M左右。

二.乐观锁和悲观锁

  1.乐观锁

  通过数据版本号控制,适用于高查询,低修改的数据操作,提高对数据的吞吐能力。

  2.悲观锁

  通过数据库提供的锁机制,比如insert、update、delete时会给表上锁,这样可以防止其他操作者重复操作同样的记录造成脏数据,适用于高修改,低查询的数据操作。

三.List可以存放多个null。

四.sql中索引不会被命中的几种情况:

  1.索引不适用于隐式转换的情况,比如你的SELECT * FROM T WHERE Y = 5 在Y上面有一个索引,但是Y列是VARCHAR2的,那么Oracle会将上面的5进行一个隐式的转换,SELECT * FROM T WHERE TO_NUMBER(Y) = 5,这个时候也是有可能用不到索引的。

  2.很长时间没有做表分析,或者重新收集表状态信息了,在数据字典中,表的统计信息是不准确的,这个情况下,可能会使用错误的索引,这个效率可能也是比较低的。

  3.如果在T表上有一个索引Y,但是你的查询语句是这样子SELECT * FROM T WHERE FUN(Y) = XXX。这个时候索引也不会被用到,因为你要查询的列中所有的行都需要被计算一遍,因此,如果要让这种sql语句的效率提高的话,在这个表上建立一个基于函数的索引,比如CREATE INDEX IDXFUNT ON T(FUN(Y));这种方式,等于Oracle会建立一个存储所有函数计算结果的值,再进行查询的时候就不需要进行计算了,因为很多函数存在不同返回值,因此必须标明这个函数是有固定返回值的。

  4.如果在B树索引中有一个空值,那么查询诸如SELECT COUNT(*) FROM T 的时候,因为HASHSET中不能存储空值的,所以优化器不会走索引,有两种方式可以让索引有效,一种是SELECT COUNT(*) FROM T WHERE XXX IS NOT NULL或者是不能为空。

  5.查询谓词没有使用索引的主要边界,可能会导致不走索引。比如,你查询的是SELECT * FROM T WHERE Y=XXX;假如你的T表上有一个包含Y值的组合索引,但是优化器会认为需要一行行的扫描会更有效,这个时候,优化器可能会选择TABLE ACCESS FULL,但是如果换成了SELECT Y FROM T WHERE Y = XXX,优化器会直接去索引中找到Y的值,因为从B树中就可以找到相应的值。

  6.使用NOT IN和<>操作

  7.索引列排序.MySQL查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。

五.mybatis中#{}和${}区别

  当使用#{}时变量是占位符,就是一般我们使用Java jdbc的PrepareStatement时的占位符?,所有可以防止sql注入。

  当使用${}时,变量就是直接追加在sql中,一般会有sql注入问题。

posted @ 2017-08-14 21:52  钓的不是鱼  阅读(93)  评论(0编辑  收藏  举报