MySQL数据库SQL层级优化

MySQL数据库SQL层级优化

本篇主涉及MySQL SQL Statements层面的优化。

首先,推荐一个链接为万物之始:http://dev.mysql.com/doc/refman/5.0/en/optimization.html

其次,Explain作为分析SQL的优化利器,SHOW STATUS 和 PROCEDURE ANALYSE(16, 256)也蛮有用。推荐两篇MySQL Explain:

http://www.khankennels.com/presentations/pdf/explain.pdf

http://dev.mysql.com/doc/refman/5.0/en/explain-output.html

 

1、一次INSERT多条语句

避免循环单条插入,代价很昂贵!在IBATIS中一次插入多条语句配置:

<insert id="insertUserList" parameterClass="java.util.List">

 <![CDATA[

     insert into user(

         id,

         userName,

         passWord

     ) values

 ]]]]>

 <iterate conjunction=",">

 <![CDATA[

     (

         #list[].id#,

         #list[].userName#,

         #list[].passWord#

     )

 ]]]]>

 </iterate>

 </insert>

 

2、有效利用索引

-Index Unique Column。在MySQL中使用唯一索引会提升效率,仅当作为Search目的、才有必要设置。

-在WHERE条件中尽量使用索引。

-考虑联合索引,但存在”first hit”问题。

-FORCE INDEX强制使用指定索引列表,SELECT SQL_BUFFER_RESULTS强制使用MySQL生成临时结果集(使得好临时结果集、将大大提升性能,还有SQL_SMALL_RESULT、SQL_BIG_RESULT),USE INDEX给定参考索引列表,IGNORE INDEX给定忽略索引列表。

-避免在索引列使用IS NULL或NOT IS NULL。


3、一定要使用LIMIT 1

大数据集,会占用内存、带宽等资源。使用LIMIT,强迫分页,减少服务器压力。


4、尽可能地使用NOT NULL,无论是在WHERE查询还是表字段设计中使用默认值。


5、Utilize Union instead of OR

Indexes lose their speed advantage when using them in OR-situations in MySQL at least. Hence, this will not be useful although indexes is being applied. 例:

SELECT * FROM EventPrizeUser A WHERE A.`UserID`=39235750 OR A.`UserMobile`='18961751810'

vs.

(SELECT * FROM EventPrizeUser WHERE `UserID`=39235750)

UNION

(SELECT * FROM EventPrizeUser WHERE `UserMobile`='18961751810')

第一条走index_merge,第二条走ref(const)。ref是要优于index_merge,虽然该条语句可能OR的性能略高于UNION(约1ms),但UNION可以保证一定走索引,而MySQL的OR执行计划不走index_merge的概率也蛮高。OR的每个条件列都必须使用索引,OR才使用索引。



6、使用合适确数据类型、缩减存储空间

-使用ENUM、而不是VARCHAR。ENUM利用TINYINT、类型紧凑、比较快,但却可以有字符串的“华丽外表”。如果是预定义好的类型,可以尝试SET类型。?ENUM新增类型。使用PROCEDURE ANALYSE分析出表的ENUM建议。

-使用DATE、TIMESTAMP,避免DATETIME。TIMESTAMP的存储空间是DATETIME的一半。


7、避免不必要排序,如DISTINCT等都会触发排序

-GROUP BY A ORDER BY NULL。GROUP BY默认会使用排序,所以如果结果集比较大、可以采用ORDER BY NULL去掉。

-ORDER BY,仅对WHERE中同个组合索引内的key采用统一ASC/DESC方式

例:SELECT * FROM WHERE part_key1 ORDER BY part_key1 DESC, part_key2 DESC



8、慎用NOT,避免使用IN、 NOT IN、<>、OR或HAVING等

用EXIST、NOT EXISTS代替IN、NOT EXISTS,因为可以直接走关联子句的WHERE。<>可以用 “> & <”代替。如:

SELECT MemberCardID FROM `MC_MemberCard` WHERE MemberCardID <> 1247

vs.

SELECT MemberCardID FROM `MC_MemberCard` WHERE MemberCardID < 1247 OR MemberCardID > 1247

faster 1ms



9、Wildcard,LIKE ‘a%’,NOT ‘%a%’

’a%’为前缀匹配、走索引,但’%a%’导致全表查询。


10、不要以字符形式声明数字

a=1、NOT  a = ‘1’,因为会使索引失效、导致全表扫描。?会么?


11、禁用SELECT FOR UPDATE

FOR UPDATE属于悲观锁(Pessimistic Locking),在整个数据处理过程中将处于锁定状态。乐观锁(Optimistic Locking)则采用更加宽松的锁机制。wiki定义如下:

Optimistic concurrency control (OCC) is a concurrency control method for relational database management systems that assumes that multiple transactions can complete without affecting each other, and that therefore transactions can proceed without locking the data resources that they affect. Before committing, each transaction verifies that no other transaction has modified its data. If the check reveals conflicting modifications, the committing transaction rolls back。

乐观锁最常用方式是通过version或TIMESTAMP,防止数据不一致问题。修改数据时可利用行写锁保证唯一性:

UPDATE T SET VERSION+1=VERSION WHERE ID=xxx

Hibernate在框架支持乐观锁机制,IBATIS中暂时没有相应支持,但可参考下文:

http://matejtymes.blogspot.hk/2010/11/optimistic-locking-on-ibatis.html

还可使用前置条件解决并发问题,如:

UPDATE STATUS=’BUY_SUCC’ WHERE OrderId=xxx AND Status=’WAITING_PAY’


12、垂直分割

水平分割、SQL太复杂不好处理,但经验而言,一般情景下是没有太多效率提升,可以将查询频烦、固定表长的部分作为一部分。?啥时候该做这件事?


13、高并发写操作的表,不建议使用自增ID

使用自增ID、会引起写锁保护,也不能使用MySQL的UUID(),因为会导致主备数据不一致。并发应用程序中生成ID,保证唯一性、推荐两种方式:

-经典的combined guid/timestamp方式:占32字节,效率太慢。利用BitConverter.ToInt64()转换成8个字节,可以接受的友好;

-根据业务规则自定义方案。如:12位年月日时分秒+3位服务器编码+3位表编码+5位随机码/流水码。?啥级别自增会防碍读写?


14、使用Prepared Statements(JDBC)

次少SQL解析、生成执行计划次数,顺带过滤注入。在IBATIS中,#{id}表示PreparedStatement parameter,在XML语句配制中有statementType参数,默认为PREPARED。


再送一个SQL优化的网站:

http://www.mysqlperformanceblog.com/



posted on 2013-12-12 21:51 我思我能 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/icanth/p/3472090.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/575651.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单峰数组找最大元素C语言,查找单峰数组中的第k个元素

给定一个n个不同元素的单峰数组A(意味着它的条目按递增顺序排列直到其最大元素&#xff0c;之后其元素的递减顺序)&#xff0c;则整数p (即增加的第一部分的长度)和k(第k个最小元素)给出算法以计算在O(log n)时间中运行的第k个最小元素的值。查找单峰数组中的第k个元素例子&…

新距离

1、这是个现实的社会&#xff0c;感情不能当饭吃&#xff0c;贫穷夫妻百事哀。不要相信电影里的故事情节&#xff0c;那只是个供许多陌生人喧嚣情感的场所。只有不理智和不现实的人才相信。  2、给自己定目标&#xff0c;一年&#xff0c;两年&#xff0c;五年&#xff0c;也…

android edittext 手机号码,Android中EditText中的电话号码格式

在Android的EditText中输入电话号码时,如何设置(xxx)xxx-xxxxx格式的电话号码&#xff1f;我想要(,),-字符自动添加到特定位置.我写了代码,但仅在andorid 2.2版本中有效,而在上述版本中无效.我在stackoverflow中搜索了更多问题.请检查我的代码&#xff1a;phone.addTextChanged…

Apache FtpServer配置步骤总结

Apache旗下的FtpServer&#xff08;免费开源&#xff0c;跨平台&#xff0c;java语言编写&#xff09;配置步骤总结 1、在windows服务器安装jre&#xff0c;下载jre7,并安装。&#xff08;java运行环境&#xff09;&#xff0c;经过实验&#xff0c;不必安装jdk。2、设置坏境变…

android开发 文件分享到应用,Android开发之——7.0适配之应用之间共享文件(FileProvider)...

前言Android 7.0强制启用了被称作StrictMode的策略&#xff0c;带来的影响就是你的App对外无法暴露file://类型的URI了。如果你使用Intent携带这样的URI去打开外部App(比如&#xff1a;打开系统相机拍照)&#xff0c;那么会抛出FileUriException异常。官方给出解决这个问题的方…

DB2临时表空间的作用

临时表空间分为系统临时表空间和用户临时表空间 系统临时表空间用来存储各种数据操作&#xff08;排序、重组表、创建索引、连接表&#xff09;中所需的内部临时数据&#xff0c;虽然可以创建任意多个系统临时表空间&#xff0c;但建议用户只使用大多数表所使用的页大小创建一个…

android涂鸦板保存功能,android实现涂鸦,保存涂鸦后的图片,清屏

自定义view的类&#xff0c;代码如下&#xff1a;[html]package com.xy.tuya;import android.annotation.SuppressLint;import android.content.Context;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Canvas;import android…

技术要求→物理安全→防盗窃和防破坏

一、要求内容a)应将主要设备放置在机房内&#xff1b;b)应将设备或主要部件进行固定&#xff0c;并设置明显的不易除去的标记&#xff1b;c)应将通信线缆铺设在隐蔽处&#xff0c;可铺设在地下或管道中&#xff1b;d)应对介质分类标识&#xff0c;存储在介质库或档案室中&#…

android nv21图片格式,Android -- 将NV21图像保存成JPEG

//保存一张照片String fileName "IMG_" String.valueOf(index) ".jpg"; //jpeg文件名定义File sdRoot Environment.getExternalStorageDirectory(); //系统路径String dir "/jpeg/"; //文件夹名File mkDir new File(sdRoot, dir);if (!mkD…

u-boot,linux,文件系统移植笔记1

今天把u-boot,linux,yaffs2文件系统的移植全部搞定了&#xff0c;在我的mini2440板子上跑起来了&#xff0c;呵呵&#xff0c;兴奋啊&#xff01;现在回头看看自己花了这么长时间所作的工作&#xff0c;结论就是&#xff0c;只要坚持下去就一定会成功的。 下面就把我移植过程中…

android限制安装包来源,Android系统设置settings应用学习(一)--允许未知来源应用安装...

settings&#xff0c;是Android系统应用--设置的源代码&#xff0c;包名称为&#xff1a;com.android.settings安全设置代码&#xff1a;SecuritySettings.java/** Copyright (C) 2007 The Android Open Source Project** Licensed under the Apache License, Version 2.0 (the…

浏览器与服务器响应流程-----(转)

一. 解析域名地址为IP地址 浏览器DNS缓存&#xff1a;以Chrome为例&#xff0c;在浏览器窗口中输入chrome://net-internals/#dns&#xff0c;就可以查看当前浏览器DNS缓存记录&#xff0c;chrome的DNS缓存过期时间还是比较短的&#xff0c;大约为1分钟。 本机DNS缓存&#xff1…

android关键应用程序,Android应用程序的四个关键点

对于一个Android应用程序来说&#xff0c;是由四种关键构造块组织而成的&#xff0c;这四种构造块分别是&#xff1a;Activity、Intent Receiver、Service、Content Provider但是&#xff0c;并不是每一个Android应用程序都需要这四种构造块&#xff0c;这不是必须的&#xff0…

手把手教你使用FineUI开发一个b/s结构的取送货管理信息系统(附源码+视频教程(第6节))...

一 本系列随笔概览及产生的背景 近阶段接到一些b/s类型的软件项目&#xff0c;但是团队成员之前大部分没有这方面的开发经验&#xff0c;于是自己选择了一套目前网上比较容易上手的开发框架&#xff08;FineUI&#xff09;&#xff0c;计划录制一套视频讲座&#xff0c;来讲解如…

Pc-98 android,PC安卓多功能搞机助手3.98

V3.98版本更新日志&#xff1a;1.全新多设备检测机制&#xff0c;底层代码重写&#xff1b;2.新增支持检测安卓用户是否允许当前电脑调试设备&#xff1b;3.软件冻结#卸载中新增清除指定应用数据&#xff1b;4.小米线刷检测功能优化&#xff0c;修复之前版本不能正确识别设备是…

拼接路径的两种方式

//本文永久链接,转载请注明出处:http://www.cnblogs.com/ChenYilong/p/3490669.html https://www.evernote.com/shard/s227/sh/1401e497-899e-4b04-9ff6-e1d9638e9f25/f6b722ed5cb2c5f603a9b242ee7fe230转载于:https://www.cnblogs.com/ChenYilong/p/3490669.html

android像素鸟,像素鸟Flappy Bird

Flappy Bird是最近非常热门的一款像素游戏&#xff0c;Flappy Bird 的游戏规则异常简单&#xff1a;和Frogmind Games的成名作品BADLAND类似&#xff0c;玩家只需要点击屏幕就可以操作游戏&#xff0c;控制角色通过各种障碍。看似简单的规则下是让人抓狂的游戏难度。首先&#…

Android是什么 之三手机之硬件形态

手机硬件形态  本节可能与Android无关&#xff0c;但是Android系统现在这个阶段更多的是移动终端形态的开发平台&#xff0c;本节给出了Android背后的工作-Android管理的硬件是什么&#xff0c;Android的本质就是要管理好这些硬件部分&#xff0c;为用户提供一个体验更好&…

Android CPU 深度睡眠,处理器的深度和深度睡眠状态之间的差异

深度睡眠(C3)和深度睡眠(C4)是用于描述移动平台电源管理的术语。电源管理就是通过将 CPU 置于不使用状态时休眠来延长电池续航时间。C3 深度睡眠和 C4 深度睡眠是 ACPI 电源管理状态。更深的睡眠源自 CPU 和芯片组交互的改进&#xff0c;以重定向 snoop 周期。CPU 的深度 C4 状…

品味性能之道十一:JAVA中switch和if性能比较

通常而言大家普遍的认知里switch case的效率高于if else。根据我的理解而言switch的查找类似于二叉树&#xff0c;if则是线性查找。按照此逻辑推理对于对比条件数目大于3时switch更优&#xff0c;并且对比条件数目越多时switch的优势越为明显。一、测试目的最近与开发同学对于前…