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

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. javascript语言扩展:可迭代对象(5)

    文章1-4篇说的都是js中的可迭代对象,下面让我们看看ruby中的等价物. 不可否认,ruby中对于迭代器和生成器的语法都相当简洁:ruby从一开始就有一个简洁的基因,而js后来的不断扩充使得其有些语 ...

  2. Python_如何去除字符串里的空格

    个人想到的解决方法有两种,一种是 .replace(' old ',' new ')  第一个参数是需要换掉的内容比如空格,第二个是替换成的内容,可以把字符串中的空格全部替换掉. 第二种方法是像这样 ...

  3. 解密for循环工作机制之迭代器,以及生成器、三元表达式与列表解析、解压序列

    本节内容 1.迭代器协议与for循环 2.三元表达式 3.解压序列 4.列表解析 5.生成器 迭代器协议与for循环 1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代中下一项, ...

  4. 8.1 Socket编程

    8.1 Socket编程 在很多底层网络应用开发者的眼里一切编程都是Socket,话虽然有点夸张,但却也几乎如此了,现在的网络编程几乎都是用Socket来编程.你想过这些情景么?我们每天打开浏览器浏览 ...

  5. Django1.6版本的PG数据库定义手动升级

    Django1.7以后添加了migration功能,数据库定义的升级完全实现自动化,之前是通过一个叫south的app来做的.这篇文章谈一下1.6下的手动更新升级. 1.table create和ta ...

  6. JS中sessionstorage的getItem/setItem/removeItem/clear

    function people(){ } var animal = { name: "cc", age:16, say:function(m1,m2){ alert("他 ...

  7. SOFA 源码分析 — 扩展机制

    前言 我们在之前的文章中已经稍微了解过 SOFA 的扩展机制,我们也说过,一个好的框架,必然是易于扩展的.那么 SOFA 具体是怎么实现的呢? 一起来看看. 如何使用? 看官方的 demo: 1.定义 ...

  8. JavaScript函数节流和函数防抖之间的区别

    一.概念解释  函数节流和函数防抖,两者都是优化高频率执行js代码的一种手段.  大家大概都知道旧款电视机的工作原理,就是一行行得扫描出色彩到屏幕上,然后组成一张张图片.由于肉眼只能分辨出一定频率的变 ...

  9. python3 分布式爬虫

    背景 部门(东方IC.图虫)业务驱动,需要搜集大量图片资源,做数据分析,以及正版图片维权.前期主要用node做爬虫(业务比较简单,对node比较熟悉).随着业务需求的变化,大规模爬虫遇到各种问题.py ...

  10. SQL转化为MapReduce的过程

    转载:http://www.cnblogs.com/yaojingang/p/5446310.html 在了解了MapReduce实现SQL基本操作之后,我们来看看Hive是如何将SQL转化为MapR ...