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

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. The 6th tip of DB Query Analyzer

      The 6th tip of DB Query Analyzer MA Gen feng (Guangdong Unitoll Services incorporated, Guangzhou ...

  2. DB Query Analyzer 5.02 is distributed, 53 articles concerned have been published

    DB Query Analyzer is presented by Master Gen feng, Ma from Chinese Mainland. It has English version ...

  3. javascript算术运算溢出

    js中的算术在溢出overflow,下溢underflow或被0整除时不会报错. 当数字结果超过了数字上限时,结果为一个特殊的无穷大(infinity)值,在js中以Infinity表示:同理,当负数 ...

  4. ES6中Promise详解

    Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果.从语法上说,Promise 是一个对象,从它可以获取异步操作的消息. Promise 提供统一的 AP ...

  5. Supervisor安装、配置、开启启动

    1.安装Python包管理工具(easy_install) wget --no-check-certificate https://bootstrap.pypa.io/ez_setup.py -O - ...

  6. linux系统安装mysql数据库

    1.首先关闭linux的防火墙,执行命令 chkconfig iptables off 2.从mysql官网上下载自己适合的mysql版本https://dev.mysql.com/downloads ...

  7. Storm 常用命令

    1.启动Nimbus bin/storm nimbus & 2.启动Supervisor bin/storm supervisor & 3.启动UI bin/storm ui & ...

  8. linux快速清空文件 比如log日志

    linux中快速清空文件内容的几种方法这篇文章主要介绍了linux中快速清空文件内容的几种方法,需要的朋友可以参考下 权限要求: 至少执行用户对该文件有写的权限 --w------- 1 QA_Dep ...

  9. 自动生成MyEclipse 安装破解码

    新建一个class 文件,Debug 模式运行一个,输入任意值 ,回车得到破解安装码 代码文件如下: import java.io.*; public class MyEclipseGen { pri ...

  10. Android字符串资源及其格式化

    http://blog.csdn.NET/wsywl/article/details/6555959 在Android项目布局中,资源以XML文件的形式存储在res/目录下.为了更好的实现国际化及本地 ...