sql优化和书写技巧

Easter79
• 阅读 581

1、EXPLAIN 关键字

select_type : simple 它表示简单的select,没有union和子查询

type: 访问类型  ALL 扫描全表,      EXPLAIN select * from sk_user index 只查询索引,       EXPLAIN select found_time from sk_user range 根据范围通过索引查询 一般查询语句最少得到这个程度,      EXPLAIN select * from sk_user where  found_time > '2015-10-22 00:00:00' ref 根据具体值通过索引查询,      EXPLAIN select * from sk_user where  found_time = '2015-10-23 14:11:02' eq_ref,  const,  system

possible_keys: sql可能被用到的索引

key: sql正在使用的索引

rows: 查询的记录行数

2、mysql隐式类型转换问题     如果sql中出现隐式类型转换,则查询条件不会走索引     EXPLAIN select * from sk_user where found_time > now()     EXPLAIN select * from sk_user where found_time > DATE_FORMAT(now(),'%Y-%c-%d %H:%i:%s')

3、 1=1      sql在执行之前需要解析,而在mysql中 1=1这个查询条件 需要解析时判断这个语句的语义,最终忽略它, 这个是需要消耗服务器资源的,当然数据量少的时候几乎没有感知。但是有些数据库当中1=1的条件并不会被解析器优化掉。

4、count(1)和count(*)     count(1) 空行会被忽略

5、明确返回列     

6、关键字大写     数据库会自己把关键字转换成大写,也就是说如果在写sql时关键字都写成大写的话,sql预编译时会少一步     mysql数据库....这个数据库sql是区分大小写的,我们这里不区分 是因为我们配置数据库的时候设置了大小写不敏感     

7、like问题,%在前面时, 不会走索引

8、in和exist     IN适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况,一般情况下都建议采用EXISTS。

9、避免深层嵌套     原则上嵌套查询需要控制在3层以内。

10、join和子查询     因为在mysql体系当中,有子查询时,mysql会给内层查询建立临时表,而临时表用完之后需要销毁,所以比较而言join的效率会高     在查询中尽量避免出现创建临时表的操作。

11、排序问题     减少排序数据和使用索引排序都会提高排序效率,排序字段有空数据时,排序效率下降

12、避免or     在适当的场景中 使用union all代替or会有效提高sql效率

13、优化使用频率高的sql     使用频率越高的sql,优化的优先级越高

14、is not null     查询条件中不要出现is null或者is not null

15、在查询条件中,尽量避免运算           16、尽量避免update表的全部字段

17、where的先后顺序问题     执行时,是从右往左执行。

18、DISTINCT和EXISTS     在能使用EXISTS的时候 尽量不使用DISTINCT

19、使用>= 替换 >     select * from a where id >= 4     select * from a where id > 3     两者的区别在于,前者DBMS将直接跳到第一个id等于4的记录而后者将首先定位到id=3的记录并且向前扫描到第一个id大于3的记 录。

20、联合索引问题     在使用联合索引时,必须首先使用联合索引的第一个字段

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Easter79 Easter79
3年前
sql注入
反引号是个比较特别的字符,下面记录下怎么利用0x00SQL注入反引号可利用在分隔符及注释作用,不过使用范围只于表名、数据库名、字段名、起别名这些场景,下面具体说下1)表名payload:select\from\users\whereuser\_id1limit0,1;!(https://o
Stella981 Stella981
3年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Wesley13 Wesley13
3年前
Oracle一张表中实现对一个字段不同值和总值的统计(多个count)
需求:统计WAIT\_ORDER表中的工单总数、未处理工单总数、已完成工单总数、未完成工单总数。表结构:为了举例子方便,WAIT\_ORDER表只有两个字段,分别是ID、STATUS,其中STATUS为工单的状态。1表示未处理,2表示已完成,3表示未完成总数。 SQL:  1.SELECT   2
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
11个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
Easter79
Easter79
Lv1
今生可爱与温柔,每一样都不能少。
文章
2.8k
粉丝
5
获赞
1.2k