前几天和同学聊天,聊到了数据库探讨了建索引的作用。大家都用到过树信息的存放吧,为了说明索引的作用,假设现在存放父子关系的表是这样
id,parentIds,memo
一共两个字段,当新建立一个子节点时,parentIds存放的是从当前节点一直到父节点的一个序列,例如15,16,17,各个父类间使用,呵呵,大家可能已经看出问题来了吧。这样检索父节点下所有自己子节点时相当方便,只要找到它对应的parentIds,用like关键字,上帝保佑,数据量不要太大。
        现在说说like关键字吧,我个人认为对大数据量表,能不用尽量不用,因为用like很有可能造成全表扫描,并且在用like的字段上一定要建立索引,这样可能还会快点,主要看你的like是怎么写的了。用术语叫一定要符合SARG,下面举例说明,假设parentIds已经建立了索引 select * from table where parentIds like '*paraValue',要是这样一定会造成全表扫描的,如果你表数据量超过万级以上,呵呵,那你就得先喝杯咖啡再回来吧。如果用select * from table where parentIds like 'paraValue*',这样会根据索引来扫描了,速度会比第一种写法快上一个数量级,在sql里用ctrl+L分析一下当前sql的执行就会看到效果奥。如果用=找匹配关系,那建索引就太有必要了,select * from table where parentIds ="paraValue",即使你有百万数量级的数据,那检索也会控制在一秒以内,这是为什么呢? 学过二叉树的大家都知道,如果一个数组以二叉树的形式来匹配,那速度是不是会很快呢,但是利用二叉树就必须先排序,对了,建立索引的原因就是为了让它排序,这样检索时候数据库就会用二叉树的方式来检索的,速度当然快了。当然不是索引建的越多越好,因为建立完的索引是需要维护的,所以只有在经常需要扫描的列上建立索引,因为建立的索引是需要维护的,这也是要算在性能损耗里面的奥。下面是尽量不要用的比较符例如:not,<>,!>,!<,not exists,not in ,not like,这些非SARG的操作符可以用SARG的操作符代替,下面说一个简单的例子,
select * from table where parentIds<>"paraValue" 非SARG的,这样会扫描整个表。
select * from table where parentIds<"paraValue" or parentIds>"paraValue" SARG的,这样会扫描索引检测数据,可以大大提高检索的性能。