MySQL使用细节
************************************************************************
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) > #{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使用细节的更多相关文章
- 【DB】MYSQL相关细节
在进行统计API模块测试时候,需要用SQL进行查询,并和API的返回结果进行对比: 而SQL中一些以前用过的细节需要记住: 补充一下show的部分用法: MySQL中有很多的基本命令,show命令也是 ...
- Mysql 注意细节
1.无法连接远程数据库,是因为远程服务器并没有开通权限,提供给其他机子连接: 在服务器机子 开通权限: 1)进去MySql 2)mysql>GRANT ALL PRIVILEGES ...
- MySQL查询优化--细节理论
select的 high_priority还是比较有用,在实践中,平均5~6秒提高到3秒 ======================================================= ...
- mysql小细节随笔
1, MySQL decimal(x,y) 存入根据y的下一位四舍五入,查了半天以为是laravel模型做了预处理,结果发现不是,是mysql decimal类型数据自动处理的,有好,也不好,合并订 ...
- MySql数据库细节使用规范
一.基础规范 (1)必须使用InnoDB存储引擎 解读:支持事务.行级锁.并发性能更好.CPU及内存缓存页优化使得资源利用率更高 (2)必须使用UTF8字符集 解读:万国码,无需转码,无乱码风险,节省 ...
- mysql.user细节三问
一.如何拒绝用户从某个精确ip访问数据库假如在mysql.user表中存在用户'mydba'@'192.168.85.%',现在想拒绝此用户从某个精确ip访问数据库 # 创建精确ip用户,分配不同的密 ...
- Mysql 一些细节方面解析(一)--MyISAM和InnoDB的主要区别和应用场景
myisam和innodb 简介:myisam读的效果好,写的效率差,这和它数据存储格式,索引的指针和锁的策略有关的,它的数据是顺序存储的,他的索引btree上的节点是一个指向数据物理位置的指针,所以 ...
- 【Mysql】细节补充,约束、索引等
约束: 显示建表语句:show create table 表名 查询表中的约束:SELECT * FROM information_schema.`TABLE_CONSTRAINTS` where ...
- 零基础如何自学MySQL数据库?
作者:姜健链接:https://www.zhihu.com/question/34840297/answer/67536521来源:知乎著作权归作者所有,转载请联系作者获得授权. 本人是个活生生的例子 ...
随机推荐
- iOS AFNetworking使用技巧与问题
1.很多初学者,在每处用到网络请求的地方会直接拿afn实例去请求,从而带来了后续难以维护代码的问题 [[AFHTTPSessionManager manager] POST:nil parameter ...
- 【图片版】学习CSS网格布局
简言 CSS网格布局(Grid)是一套二维的页面布局系统,它的出现将完全颠覆页面布局的传统方式.传统的CSS页面布局 一直不够理想.包括table布局.浮动.定位及内联块等方式,从本质上都是Hack的 ...
- navicat for mysql远程连接ubuntu服务器的mysql数据库
经常玩服务器上的mysql数据库,但是基于linux操作Mysql多有不便,于是就想着使用GUI工具来远程操作mysql数据库.已经不是三次使用navicat-for-mysql了,但是每次连接远程服 ...
- java虚拟机的类加载机制
引言 我们写的代码是放在.java文件中,经过编译器编译后,转成.class文件.Class文件是一串二进制流,它可以被各平台的虚拟机所接受,实现跨平台. 虚拟机将描述类的数据从class文 ...
- 排序算法入门之插入排序(java实现)
插入排序思想:相当于插入元素,对于第i个元素,i之前的元素已经是有序的了,这时候将第i个元素依次与前面元素比较,插入合适的位置.
- .net找List1和List2的差集
有个需求是找两个自定义类泛型集合的差集: class Person { public string Name{get; set;} public string Country{get; set;} } ...
- Django1.6版本的PG数据库定义手动升级
Django1.7以后添加了migration功能,数据库定义的升级完全实现自动化,之前是通过一个叫south的app来做的.这篇文章谈一下1.6下的手动更新升级. 1.table create和ta ...
- ruby1.9.2 +windowxp
ruby1.9.2 install on the window xp 1:在公司上網是有windows代理的(ntlm),而rails又都是gem安裝,對于接觸rails不多的人來時真是一場災難,我是 ...
- Spring Cache 笔记
@(Java ThirdParty)[Spring Cache] Spring Cache Abstraction 简介 Spring Cache提供了对底层缓存使用的抽象,通过注解的方式使用缓存,减 ...
- builder设计模式(摘录ITeye文章lintomny)
对于Builder模式很简单,但是一直想不明白为什么要这么设计,为什么要向builder要Product而不是向知道建造过程的Director要.刚才google到一篇文章,总算清楚了.在这里转贴一下 ...