关于SQL有什么技巧分享?
通常我们的SQL都是写在代码中的,执行一次SQL需要经历网络传输、SQL的执行、如果是查询操作,会有查询结果返回,再每一个步骤中,都需要注意效率问题。(第二部分会着重说SQL的一些经验)
减少数据访问(减少磁盘访问) :使用索引;
返回更少数据(减少网络传输或磁盘访问) :数据分页处理、只返回需要的字段;
减少交互次数(减少网络传输) :批量执行、使用存储过程;
减少服务器CPU开销(减少CPU及内存开销):使用绑定变量、合理使用排序、减少比较操作、大量复杂运算在客户端处理;
利用更多资源(增加资源)。
既然题目中问到了SQL,还是主要说一下SQL的一些技巧,主要是索引的使用。
B-Tree索引:说到数据库的索引,大多数时候都是指B-Tree索引,B-Tree索引适用于全键值、范围、前缀的查找;主键、外键必须有索引,当然很多系统都是逻辑外键(或需要经常和其他表关联),也需要建立索引;经常出现在where、order by、group by中的字段;尽量把索引建立到小字段上;对于文本字段或者很长字段,不要建索引;
联合索引:也是B-Tree索引,这里单独拿出来强调一下【联合索引的最左原则】,如果不是按索引的最左列查找,那么将无法使用索引。最左原则:如果创建了一个联合索引(name,age,gender),相当于创建了三个索引(name)、(name,age)、(name,age,gender)。联合索引,左边的列有范围查找,那么右边的列无法使用索引。比如index(age,gender),where age > 20 and gender = 'M';这时候就会有问题。解决办法也很简单,两个字段分别建立索引。
哈希索引:是基于哈希表,精确匹配索引所有列的查询才有效;
全文索引、聚簇索引、聚簇索引等等,就不详细说了,因为...我也不太会,几乎没有用过。
索引的一些小技巧前导模糊查询,会导致索引失效:where name like '%XX';
数据区分度不大,不建议使用索引:where gender = 'M';性别只有男、女、未知三种;
等号左边有函数,会索引失效:where LENGTH(col1) = 10;
隐式转换的问题:where col2 = '100',col2列是数字,等号左右类型不一致,col2会隐式转换成字符串;
尽量不好使用负向查询,例如:!=、not in、not exists;
单列索引不存null值,复合索引不存全为null的值(索引列尽量使用not null的约束并设置默认值);
索引不是越多越好。
我将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注。Copyright © 广州京杭网络科技有限公司 2005-2025 版权所有 粤ICP备16019765号
广州京杭网络科技有限公司 版权所有