常见得SQL实践

1)select * from table where state!=0 and state!=1  not in/not exists这样的尽量不要出现在搜索语句中

可以改为  select * from order where state in(2,3);

2)前导模糊查询是不能够使用索引的

select * from table desc like ‘%XX‘;

然而非前导模糊查询可以是:

select * from table where desc like ‘XX%’;

3)数据区分不大的字段不建议使用索引

select * from table where sex=1;

在性别上,只有男女,每次过滤的数据很少,这样反而会降低索引

(4)在属性上进行计算不能命中索引

  • select * from order where YEAR(date) < = ‘2017‘

即使date上建立了索引,也会全表扫描,可优化为值计算:

  • select * from order where date < = CURDATE()

或者:

  • select * from order where date < = ‘2017-01-01‘

二、并非周知的SQL实践

(5)如果业务大部分是单条查询,使用Hash索引性能更好,例如用户中心

  • select * from user where uid=?
  • select * from user where login_name=?

原因:

B-Tree索引的时间复杂度是O(log(n))

Hash索引的时间复杂度是O(1)

(6)允许为null的列,查询有潜在大坑

单列索引不存null值,复合索引不存全为null的值,如果列允许为null,可能会得到“不符合预期”的结果集

  • select * from user where name != ‘shenjian‘

如果name允许为null,索引不存储null值,结果集中不会包含这些记录。

所以,请使用not null约束以及默认值。

(7)复合索引最左前缀,并不是值SQL语句的where顺序要和复合索引一致

用户中心建立了(login_name, passwd)的复合索引

  • select * from user where login_name=? and passwd=?
  • select * from user where passwd=? and login_name=?

都能够命中索引

  • select * from user where login_name=?

也能命中索引,满足复合索引最左前缀

  • select * from user where passwd=?

不能命中索引,不满足复合索引最左前缀

(8)使用ENUM而不是字符串

ENUM保存的是TINYINT,别在枚举中搞一些“中国”“北京”“技术部”这样的字符串,字符串空间又大,效率又低。

三、小众但有用的SQL实践

(9)如果明确知道只有一条结果返回,limit 1能够提高效率

  • select * from user where login_name=?

可以优化为:

  • select * from user where login_name=? limit 1

原因:

你知道只有一条结果,但数据库并不知道,明确告诉它,让它主动停止游标移动

(10)把计算放到业务层而不是数据库层,除了节省数据的CPU,还有意想不到的查询缓存优化效果

  • select * from order where date < = CURDATE()

这不是一个好的SQL实践,应该优化为:

$curDate = date(‘Y-m-d‘);

$res = mysql_query(

‘select * from order where date < = $curDate‘);

原因:

释放了数据库的CPU

多次调用,传入的SQL相同,才可以利用查询缓存

(11)强制类型转换会全表扫描

  • select * from user where phone=13800001234

你以为会命中phone索引么?大错特错了,这个语句究竟要怎么改?

末了,再加一条,不要使用select *(潜台词,文章的SQL都不合格 =_=),只返回需要的列,能够大大的节省数据传输量,与数据库的内存使用量哟。

思路比结论重要,希望有收获。

时间: 2024-11-05 20:29:21

常见得SQL实践的相关文章

SQL 实践和技巧 &lt;2&gt;

转自   http://i.cnblogs.com/EditPosts.aspx?opt=1 几个小技巧   (1)||的使用: select ‘(‘||phone[1,3]||’)’phone[5,12], from customer where customer_num=106; Result:(415)389-8789 (2)TRIM的使用:select trim(fname) from customer; 删除前导和后继空格. select trim(leading ‘1’ from p

【SQL实践】其他常用SQL汇总

[SQL实践]其他常用SQL汇总 1.联表更新 update students stu inner join course on course.STUDENT_ID=stu.id set stu.name=course.ID

Ali-HBase的SQL实践与改进

摘要: 2017云栖大会Hbase专场,阿里巴巴技术专家天穆带来Ali-HBase的SQL实践与改进的演讲.本文主要从为什么需要SQL开始谈起,进而讲解了SQL on Hbase,接着着重分享了Ali-Hbase SQL的优化与改进,最后对未来进行了展望. 2017云栖大会Hbase专场,阿里巴巴技术专家天穆带来Ali-HBase的SQL实践与改进的演讲.本文主要从为什么需要SQL开始谈起,进而讲解了SQL on Hbase,接着着重分享了Ali-Hbase SQL的优化与改进,最后对未来进行了

常见的SQL Server查询语句

// 备注:这里列出一些使用频率比较高的SQL语句语法,以便他日查询和使用 SQL语句由命令.子句.运算符和统计函数组成. 一. 命令  1. 数据定义命令: CREATE: 建立新的数据表.字段和索引表: DROP: 从数据库删除数据表或索引: ALTER: 增加或修改字段属性: 2. 数据操作命令: SELECT: 找出满足条件的记录: INSERT: 增加记录或合并两个数据表: UPDATE: 更新满足条件的记录: DELETE: 删除满足条件的记录: 二. 子句  FROM: 指定数据表

PostgreSQL 常见慢SQL问题解决方法

刚熟悉PG的开发者接触PG时,或多或少会碰到一些问题.常见的表现是碰到一些慢SQL.这时候别急着吐槽.绝大多数并不是问题,稍微的语法调整或进行一些简单的优化就能解决问题.下面具体分析几个案例. 一: 中文字符串的索引扫描慢test =# \d testidx                  Table"test.testidx"    Column         |        Type                 | Modifiers----------------+--

常见的敏捷实践

1 回顾 回顾是最重要的一个实践,原因是它能让团队学习,改进和调整其过程. 回顾可以帮助团队从之前的产品开发工作及其过程中学习.<敏捷宣言>背后的原则之一是:“团队要定期反省如何能够做到更加有效,并相应地调整团队的行为.” 许多团队使用迭代,尤其是为期两周的迭代,因为迭代在最后会提示进行演示和回顾.不过,团队回顾并不需要迭代.团队成员可以决定在这些关键时刻进行回顾: 当团队完成一个发布或者加入一些功能是时.这不一定是一个巨大的增量.他可以是任何发布,无论它有多小. 自上次回顾以来,又过了几周时

这8种常见的SQL错误用法,80%的人还在使用

点点这个链接免费获取:本人免费整理了Java高级资料,涵盖了Java.Redis.MongoDB.MySQL.Zookeeper.Spring Cloud.Dubbo高并发分布式等教程,一共30G,需要自己领取.传送门:https://mp.weixin.qq.com/s/osB-BOl6W-ZLTSttTkqMPQ 1.LIMIT 语句 分页查询是最常用的场景之一,但也通常也是最容易出问题的地方.比如对于下面简单的语句,一般 DBA 想到的办法是在 type, name, create_tim

PhoneGap下Web SQL实践

HTML5里的Web SQL数据库,内置了SQLite数据库, 对数据库的操作使用executeSql执行增删改查 1. 创建数据库 function creatDatabase(){ db = openDatabase('Student', '1.0', 'StuManage', 2 * 1024 * 1024); } 2. 创建表 function createTable(){ if (db) { var strSQL = "create table if not exists StuInf

【常见的SQL Server连接失败错误以及解决方法】

http://blog.csdn.net/feixianxxx/article/details/5523922 ADO连接SQL Server 2008 Express方法总结 https://wenku.baidu.com/view/551fb613cc7931b765ce156d.html