不管是用C/C++/Java等代码编写的程序,还是SQL编写的数据库脚本,都存在一个持续优化的过程。也就是说,代码优化对于程序员来说,是一个永恒的话题。
近期,我们对之前编写的数据库脚本进行了全面的自查,从数据库的性能方面考虑,将脚本里面的很多SQL语句进行了优化。对于一条SQL语句来说,索引的使用是否正确将直接影响到数据库的性能,因此,对索引使用方法的优化是数据库性能优化的重点。本文对常用的数据库索引优化语句进行了总结,可供相关的开发人员参考。
索引优化建议 
1.对索引列进行计算 
例如,我们想要将表tb_test中id大于100的数据记录中的age和name查找出来。
正确的SQL语句是:
select age,name from tb_test where id > 1*100;
不建议采用的SQL语句是:
select age,name from tb_test where id/100 > 1;
2.对索引列进行拼接 
例如,我们想要将表tb_test中name为“zhou”、addr为“CQ”的记录中的id和age查找出来。
正确的SQL语句是:
select id,age from tb_test where name=’zhou’ and addr=’CQ’;
不建议采用的SQL语句是:
select id,age from tb_test where concat(name,’ ‘,addr) = ‘zhou CQ’;
3.在索引列上is null或is not null的使用 
例如,我们想要将表tb_test中id大于等于“0”的记录中的age查找出来。
正确的SQL语句是:
select age from tb_test where id >= 0;
不建议采用的SQL语句是:
select age from tb_test where id is not null;
4.在索引列上or的使用 
例如,我们想要将表tb_test中id等于101或102的记录中的age和name查找出来。
正确的SQL语句(使用union)是:
select age,name from tb_test where id = 101 union select age,name from tb_test where id = 102;
不建议采用的SQL语句(使用or)是:
select age,name from tb_test where id = 101 or id = 102;
5.尽可能避免索引列在like的首字符使用通配符 
例如,我们想要将表tb_test中name匹配“zho”的记录中的id和age查找出来。
正确的SQL语句是:
select id,age from tb_test where name like ‘zho%’;
不建议采用的SQL语句是:
select id,age from tb_test where name like ‘%ho%’;
6.复合索引的使用 
如果我们建立的索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引。
例如,我们在表tb_test上新建了如下索引:
create index idx4_tb_test on tb_test(id,name,addr);
以上索引idx4_tb_test相当于建立了index(id)、index(id,name)、index(id,name,addr) 这3个索引。在SQL语句的where条件中单独使用name或addr时不会使用到该索引,必须使用id时才会使用到该索引。
总结 
在我们编写的SQL语句中,不正确地使用索引列可能会导致索引不被使用,而进行全表扫描,极大地降低了数据库的性能。因此,学习正确的索引的使用方法实在是很有必要的。

但是,需要指出的是,本文中提到的数据库索引的优化语句必须要在操作大量数据时才能显示出效果。在编写数据库脚本之前,大家可以先评估一下系统的数据量,看是否有必要在SQL优化上花费大量的时间。

最新文章

  1. BZOJ 3144 [Hnoi2013]切糕 ——网络流
  2. C#:时间转换
  3. The user specified as a definer ('root'@'%') does not exist
  4. SQLite中文排序
  5. 苹果IPhone手机由于更新了IOS7 Beta测试版导致“激活出错”后,如何还原电话本和照片方法
  6. Linq之Expression初见
  7. WEBUS2.0 In Action - 搜索操作指南 - (4)
  8. 表格行变换顺序功能(jquery)
  9. android升级软件版本号,您安装后的新版本号,成功安装画面没有出现,或直接回到桌面
  10. Hybrid app 发展历程
  11. mysql varchar和char的根本区别深度详解
  12. Tornado 网站demo 一
  13. Android进阶(十)Android 发邮件
  14. 简单计算器 安卓 Android 作业
  15. ubuntu下查看磁盘读写情况
  16. IIS 重写 HTTP 重定向到 HTTPS
  17. MFC TabCtrl 控件修改标签尺寸
  18. win7下python2.6如何安装setuptools和pip
  19. c# 关于字典dictionary 按时间排序
  20. ZAB协议和Paxos算法

热门文章

  1. [USACO17JAN] Subsequence Reversal序列反转 (dfs+记忆化)
  2. [LeetCode] 242. 有效的字母异位词 valid-anagram(排序)
  3. 题解 P3377 【【模板】左偏树(可并堆)】
  4. org.apache.hadoop.ipc.Client: Retrying connect to server
  5. Rails内存的问题 Java内存情况
  6. Android,iOS打开手机QQ与指定用户聊天界面
  7. IOS版本号被拒的经历
  8. iOS KVC(Key-Value Coding)
  9. vue 路由demo2
  10. JAVA设计模式之【状态模式】