************************************************************************

MySQL使用细节,包括部分常用函数以及注意如何提高数据库查询性能

************************************************************************

1、union (union all):将子查询得到的结果集合合并

<select id="checkIsRelated" resultType="com.etom.ebihm.model.ext.MdProBatchExt" parameterType="String">
SELECT pb.PRO_BATCH_ID FROM MD_PRO_BATCH pb WHERE pb.PRO_BATCH_ID = #{proBatchId}
UNION ALL SELECT p.PRO_BATCH_ID FROM MD_PARTITION p WHERE p.PRO_BATCH_ID = #{proBatchId}
UNION ALL SELECT pm.PRO_BATCH_ID FROM MD_PRE_MAINTAIN pm WHERE pm.PRO_BATCH_ID = #{proBatchId}
</select>

2、ifNull(字段名,默认值):判断字段是否为空,如果为空则返回默认值

<!-- 如果t.PQI_UP_RATIO为空,则返回999999999-->
IFNULL(t.PQI_UP_RATIO,999999999) &gt; #{pqiRatio}

3、查询插入

insert into md_large_measure_detail select replace(UUID(),'-',‘’),#{accountId},CORP_ID,ROW_INDEX,from md_large_measure_detail v  where 
v.large_measure_id in (select large_measure_id from md_large_measure where account_id='systemacountid00000000')

4、逻辑判断case when ...then...else... end,控制返回值

case
when age > 18 and age <= 50 then 'youngMan'
when age > 50 then 'oldMan'
else 'child'
end as type

5、exists(查询表达式)是否存在

SELECT
*
FROM
md_net_index a
WHERE
EXISTS(
SELECT
count(b.REMARK)
FROM
md_net_batch b
WHERE
b.net_batch_id = a.NET_BATCH_ID
)
and NET_INDEX_ID = '0c5e94c468a4489f8507ac70a1f4169e'

6、locate(String,subString,position):类似java中String.indexOf()方法,求子字符串subString在字符串String中的索引位置,position可选:从第position位置开始查找

locate('helloWorld','o') = 5;
locate('helloWorld','o',6) = 7; <!--从第6个字符开始查找-->

7、整数:ceil向上取整,floor向下取整

ceil(1.2) = 2;
floor(1.2) = 1;

8、添加空格space(n):添加n个空格

SELECT CONCAT(USER_NAME,SPACE(5),LOGIN_ID) USER_NAME from vc_user <!-- 张三     zhangsan -->

9、善于使用explain查看sql执行计划,方便优化脚本

使用explain时会有这些属性

id    select_type    table    type    possible_keys    key    key_len    ref    Extra

10、sql中的in包含的值不宜过多

11、select务必指明字段

12、查询数据时避免全表扫描,首先应该在where和order by使用索引

13、尽量避免在where子句查询使用null判断,否则将导致查询放弃使用索引而进行全表扫描

select name from user where age is null;
<!-- 可以在age列上的null设置为0,确保age列中没有null值,然后这样查询 -->
select name from user where age = 0;

14、尽量避免在where子句中使用 != 或者 <> 操作符,否则将导致放弃索引而扫描全表。

15、应尽量避免在where使用or连接条件,如果其中一个条件不是使用索引字段,查询则会放弃其他索引字段而扫描全表

select id from user where age = 18 or name = 'zhangsan';
<!-- 可以这样查询 -->
select id from user where age = 18
union all
select id from user where name = 'zhangsan';

16、对于in和not in也要慎重使用,否则也会将会导致全表扫描

select id from user where age in (18,19,20);
<!-- 如果是连续的值,能用between就用between -->
select id from user where age between 18 and 20;
<!-- 使用exists代替in,如 -->
select id from user where age in (select age from user)
<!-- 使用下列语句代替 -->
select id from user a where exists (select id from user b where b.age = a.age);

17、模糊查询也会引起放弃索引

select id from user where name like '%adb%';
<!-- 如果要提高效率,前缀最好不要也模糊查询,如果能精确查询最好 -->
select id from user where name like 'abc%';<!-- 效率要比上一句高 -->

18、尽量避免在where子句查询时对字段进行表达式操作,否则将会放弃索引而进行全表扫描

select id from user where age + 2 = 18;
<!-- 应该改为 -->
select id from user where age = 18 - 2;

19、尽量避免在where子句中使用函数进行操作,否则将会导致查询放弃索引从而全表查询

select id from user substring(name,1,3) = 'abc';
<!-- 应该改为 -->
select id from user where name like 'abc%);

20、在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。

21、不要在where子句中“=”左边进行表达式操作,否则导致无法正确使用索引。

22、使用update时,如果只更新1、2个字段就不要更新全部字段,频繁的调用会导致性能下降。

23、索引不是越多越好,索引虽然可以提高查询效率,但是不当的索引反而会影响性能,当进行insert和update时,索引需要对数据进行维护,过多的索引因此会降低数据库性能,所以建索引需要视情况而定

MySQL使用细节的更多相关文章

  1. 【DB】MYSQL相关细节

    在进行统计API模块测试时候,需要用SQL进行查询,并和API的返回结果进行对比: 而SQL中一些以前用过的细节需要记住: 补充一下show的部分用法: MySQL中有很多的基本命令,show命令也是 ...

  2. Mysql 注意细节

    1.无法连接远程数据库,是因为远程服务器并没有开通权限,提供给其他机子连接: 在服务器机子 开通权限: 1)进去MySql 2)mysql>GRANT   ALL   PRIVILEGES    ...

  3. MySQL查询优化--细节理论

    select的 high_priority还是比较有用,在实践中,平均5~6秒提高到3秒 ======================================================= ...

  4. mysql小细节随笔

    1, MySQL decimal(x,y)  存入根据y的下一位四舍五入,查了半天以为是laravel模型做了预处理,结果发现不是,是mysql decimal类型数据自动处理的,有好,也不好,合并订 ...

  5. MySql数据库细节使用规范

    一.基础规范 (1)必须使用InnoDB存储引擎 解读:支持事务.行级锁.并发性能更好.CPU及内存缓存页优化使得资源利用率更高 (2)必须使用UTF8字符集 解读:万国码,无需转码,无乱码风险,节省 ...

  6. mysql.user细节三问

    一.如何拒绝用户从某个精确ip访问数据库假如在mysql.user表中存在用户'mydba'@'192.168.85.%',现在想拒绝此用户从某个精确ip访问数据库 # 创建精确ip用户,分配不同的密 ...

  7. Mysql 一些细节方面解析(一)--MyISAM和InnoDB的主要区别和应用场景

    myisam和innodb 简介:myisam读的效果好,写的效率差,这和它数据存储格式,索引的指针和锁的策略有关的,它的数据是顺序存储的,他的索引btree上的节点是一个指向数据物理位置的指针,所以 ...

  8. 【Mysql】细节补充,约束、索引等

    约束: 显示建表语句:show create table 表名 查询表中的约束:SELECT * FROM information_schema.`TABLE_CONSTRAINTS`  where ...

  9. 零基础如何自学MySQL数据库?

    作者:姜健链接:https://www.zhihu.com/question/34840297/answer/67536521来源:知乎著作权归作者所有,转载请联系作者获得授权. 本人是个活生生的例子 ...

随机推荐

  1. 【Django】 gunicorn部署纪要

    使用Gunicorn 来部署Django应用, 没有一步一步写怎么操作,简单记录下重要的点,方面以后查阅. 主要的方式还是Nginx反向代理到Gunicorn, Gunicorn wsgi来启动Dja ...

  2. 近期ubuntu 14.04 cpu占用高排障

    近期linux使用总是cpu达到满值, 双核cpu其中一个核总是100%,另一个核正常.top之发现输入法框架fcitx满载,直接kill之,发现搜狗输入法不能用了,随即输入如下命令: fcitx f ...

  3. mongodb3.6 (四)net 客户端如何连接、访问mongodb集群

    前言 在是一篇文章mongodb如何做数据备灾 中已经介绍mongodb集群是如何工作,可能很多人都有这样一个疑问:客户端如何知道主服务挂了呢?这一篇文章将介绍如何在net中访问这个集群. 第一步.安 ...

  4. 实施一个SAP项目大概分为下面几个过程

    实施一个SAP项目大概分为下面几个过程 1.需求调研.了解客户需要实施的范围,比如是财务模块,后勤模块,人力资源,商务智能等等.需求调研通常有几种方法了解,和客户开会讨论:分配到具体业务人员了解:通过 ...

  5. [更新]单线程的JS引擎与 Event Loop

    先来思考一个问题,JS 是单线程的还是多线程的?如果是单线程,为什么JavaScript能让AJAX异步发送和回调请求,还有setTimeout也看起来像是多线程的?还有non-blocking IO ...

  6. Angular6.0发布

    Angular v6 新版本重点关注工具链以及工具链在 Angular 中的运行速度问题. Angular v6 是统一整体框架.Material 和 CLI 三大 Angular 组件的第一个版本, ...

  7. java集合及其方法

    1.集合框架 我们已经学习过使用数组来批量存储某一类数据: 但是,数组还是存在一些不足,比如长度不可变(建立对象的时候就已经定义好长度): 查找某一个数据时,要依靠索引值来遍历数组进行条件查找,数据量 ...

  8. Windows下配置vue的环境

    最近在学习vue.js,希望前端能用vue来作为主要框架.这里记录一下NPM在Windows中安装过程. 下载安装 下载地址 下载v6.11.0 LTS稳定版. 在C盘创建nodejs目录,并进行安装 ...

  9. Stack和Vector源码分析

    Stack和Vector源码分析 Stack和Vector源码分析stack源码分析1.Stack是什么2.Stack的结构图3.Stack继承关系4.Stack的主要方法5.Stack源码Vecto ...

  10. C++ 模板基础

    我们学习使用C++,肯定都要了解模板这个概念.就我自己的理解,模板其实就是为复用而生,模板就是实现代码复用机制的一种工具,它可以实现类型参数化,即把类型定义为参数:进而实现了真正的代码可重用性.模版可 ...