关于SQL优化这些你了解吗?
目录树
- 背景
- 优化点
- 前提必备知识
优化之一 - 从数据库设计方面考虑
优化之二 - 从SQL语句优化方面考虑
优化之三 - 读写分离与分库分表
背景
在当今这个互联网的时代无非要解决两大难题,其一是信息安全,其二就是数据的存储。而信息安全则是在数据存储的基础之上。一个公司从刚开始成立到发展成一个有上百人甚至上千人团队的时候,公司的业务量是呈上升趋势,客户及用户也会越来越多;之前设计的表结构可能会显得不合理,表与表之间的联系没有一个稳定的业务功能划分,从而表现出来的是相关表的备用字段越来越不够用甚至新加字段,最坏的情况就是不同业务表之间会有数据冗杂。从而暴露出一些设计的问题,这也就是SQL优化点之一:数据库表结构设计的合理性。近年来大数据越来越火,而大数据也是为了解决数据的存储的手段之一,其目的是从海量的数据中收集到有价值的信息然后存储到数据库中,因为数据量大传统的数据库无法储存那么多的信息所以需要分析有价值的信息后再做决定是否持久化。
优化点
- 前提必备知识
学会是用explain关键词查看SQL语句性能,explain好像是从MYSQL5.6.3开始支持 select、update、delete语句分析,之前只支持select语句。现在我们普遍都是用5.7,所以的话不需要太担心。这里的话不详细讲如何解读explain输出的性能信息。请参看博客文档:《MySQL优化之Explain命令解读》
- 优化之一 - 从数据库设计方面考虑
- 表与表之间的业务联系要明确:表之间其实是有业务联系的,比如:class(primary key:class_id,所有班级信息表)、student(primary key:student_num,所有学生信息表)、student_class(primary key:stu_class_id,所有学生所在班级信息表)着三张表,如果现在需要一张老师对应哪个班级的班主任的信息表;那么此时正确的方法是:新建 teacher、teacher_class表,而不是直接把老师的信息插入到student表中然后用一个字段来标识是老师还是学生。可能你看到这个你会想 “我肯定会按正确的那种方式啊”,但是这只是举一个例子,其实在实际项目开发过程中表与表结构往往不会那么单一,这个时候你就会犯错误而用字段标识。但是也不能说是不能用字段标识,这个要看字段标识的两种信息对应的业务是否有交叉点来取舍。
- 表字段尽量使用数值型:因为数值型字段在MySQL底层应用的时候相比string类型的话性能更好;具体为什么性能更好就需要了解MySQL底层机制了,反正记住这点就好。
- 属性尽量使用定长:以减少占用储存空间;如果你定义了一个 order_id varchar(32) ,当在存储的时候有一条记录的order_id=20180910242360,此时order_id实际占用了14个字节但是这个字段的属性长度是32,所以还有18个字节长度是无用的但却占用着内存空间。
- 建立合理的索引:索引就是用某种数据结构来查找对应的信息,从而减低时间复杂度提高查找效率。建立索引的前提也要明确,综合考虑再打算是否需要建立索引,毕竟索引是需要占用存储空间的,有时候牺牲的空间却换不回时间。
- 优化之二 - 从SQL语句优化方面考虑
1. 尽量将要输出的字段写出来;不要使用 select * from where xxxxx ;这种形式的语句。我在这测试时是使用*代替,但是记住在生产环境上尽量将字段替代*。
2. 合理使用连表查询;不仅是表的连接需要较大的内存消耗另外一方面如果表设计的不是很合理也会导致索引无效从而造成极坏的结果。
3. 查询的时候要注意是否走索引:假如你在name列建立了一个 name_index索引,查询你使用 name Like'%xxxx' 或者 name Like'%xxxx%' 这种模糊查询,那么此时可能就不会走索引;你应该这样 name Like'xxxx%' 。以下就是实际的一个例子:
建立索引:
-- 为cust_third_acct 建立一个普通索引
alter table
cust_info
add index cust_third_acct_index(cust_third_acct);
a:通过SQL查询信息: select * from sp_tunnel_user where cust_third_acct like'0200%'; 以下就是满足查询条件的部分信息
b:分析Like'%xxxx%'的查询性能: select * from sp_tunnel_user where cust_third_acct like'%0200%'; 通过Explain性能分析命令可以知道:在这种查询条件下并没有执行索引,type=all表明该语句执行的时候进行的是全表扫描;虽然我们在 cust_third_acct 这个字段建立了索引,但是 possible_keys=null 则说明了 用 like'%0200%' 这种形式的条件是一定无法使用到 cust_third_acct_index 这个索引。(其他字段的解析请参照《MySQL优化之Explain命令解读》这篇文章,这里不做过多的分析)。
c:分析Like'xxxx%'的查询性能: select * from sp_tunnel_user where cust_third_acct like'0200%'; 与b查询语句相比这个查询的 possible_keys=cust_third_acct_index ,这说明这个语句可能会用到 cust_third_acct_index 这个索引,但是key=null表明在实际的执行过程中并没有用到 cust_third_acct_index 索引;刚才我们也说了这种条件查询只是可能会走索引但是不一定发生,这个跟MySQL的存储引擎相关,但是我们使用的时候尽量以这种方式去查询。
4. 使用索引遵循最佳左前缀特性,建立联合索引的时候将常用的属性放在左边。比如:我们需在在一张表的 cust_id 和 cust_tp 建立一个联合索引 cust_id_type,设定cust_id(不是唯一) 是比较常用的那么我们就将cust_id放在左边。
建立联合索引:
-- 为cust_id与cust_tp建立一个联合索引
alter table
cust_info
add index cust_id_type(cust_id,cust_tp);
5.使用符合索引的时候需要注意:使用联合索引需要从左往右不间断,索引才会生效,也就是说联合索引使用的时候必须要连续但不要求全部使用。如:以上4我们建立了一个 cust_id_type 索引,当我们在使用的时候如果where条件中只使用了 cust_id,那么也会走索引;如果where条件中只使用了 cust_tp,那么这条语句不会走索引,以下就是一个实例:
a:select * from sp_tunnel_user where cust_id='' and cust_tp=''; 当查询条件用到cust_id与cust_tp两个字段并且cust_id在前面的时候,就会用到联合索引;通过 key=cust_id_type可以看到实际执行过程中是用到索引了的。
b:select * from sp_tunnel_user where cust_id='' ; 当查询条件只用到cust_id一个字段时,也用到了联合索引;通过 key=cust_id_type可以看到实际执行过程中是用到索引了的,这就是左前缀原则。
c:select * from sp_tunnel_user where cust_tp='' ; 当查询条件只用到cust_tp一个字段时,但却没有用到索引;通过 key=null 可以看到实际执行过程并没有用到索引,这也是左前缀原则。
- 优化之三 - 读写分离与分库分表
当数据量达到一定的数量之后,限制数据库存储性能的就不再是数据库层面的优化就能够解决的;这个时候往往采用的是读写分离与分库分表同时也会结合缓存一起使用,而这个时候数据库层面的优化只是基础。读写分离适用于较小一些的数据量;分表适用于中等数据量;而分库与分表一般是结合着用,这就适用于大数据量的存储了,这也是现在大型互联网公司解决数据存储的方法之一。至于怎么读写分离、怎么分表、怎么分库,这里不做过多的阐述后续文章会有相关知识分享。
关于SQL优化这些你了解吗?的更多相关文章
- SQL优化案例—— RowNumber分页
将业务语句翻译成SQL语句不仅是一门技术,还是一门艺术. 下面拿我们程序开发工程师最常用的ROW_NUMBER()分页作为一个典型案例来说明. 先来看看我们最常见的分页的样子: WITH CTE AS ...
- sql 优化
1.选择最有效率的表名顺序(只在基于规则的优化器中有效): oracle的解析器按照从右到左的顺序处理 from 子句中的表名,from子句中写在最后的表(基础表driving table)将被最先处 ...
- SQL 优化总结
SQL 优化总结 (一)SQL Server 关键的内置表.视图 1. sysobjects SELECT name as '函数名称',xtype as XType FROM s ...
- (转)SQL 优化原则
一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用 系统提交实际应用后,随着数据库中数据的增加,系 ...
- sql优化阶段性总结以及反思
Sql优化思路阶段性心得: 这段时间的优化做了好几个案例,其实有很多的类似点,都是好几张大表的相互连接,然后执行长达好几个小时,甚至都跑不出来. 自己差不多的思路就是Parallel full tab ...
- mysql sql优化实例
mysql sql优化实例 优化前: pt-query-degist分析结果: # Query 3: 0.00 QPS, 0.00x concurrency, ID 0xDC6E62FA021C85B ...
- SQL优化技巧
我们开发的大部分软件,其基本业务流程都是:采集数据→将数据存储到数据库中→根据业务需求查询相应数据→对数据进行处理→传给前台展示.对整个流程进行分析,可以发现软件大部分的操作时间消耗都花在了数据库相关 ...
- ORACLE常用SQL优化hint语句
在SQL语句优化过程中,我们经常会用到hint,现总结一下在SQL优化过程中常见Oracle HINT的用法: 1. /*+ALL_ROWS*/ 表明对语句块选择基于开销的优化方法,并获得最佳吞吐量, ...
- SQL优化有偿服务
本人目前经营MySQL数据库的SQL优化服务,100块钱一条.具体操作模式 其中第一条,可以通过在微信朋友圈转发链接中的信息(http://www.yougemysqldba.com/discuz/v ...
- 【MySQL】SQL优化系列之 in与range 查询
首先我们来说下in()这种方式的查询 在<高性能MySQL>里面提及用in这种方式可以有效的替代一定的range查询,提升查询效率,因为在一条索引里面,range字段后面的部分是不生效的. ...
随机推荐
- 纪念一个神坑——react-native-echarts
一.问题 在rn项目里引用的时候,本该显示图表的界面显示出了一堆html... 二.原因 官方没给配置好 三.解决 1./node_modules/native-echarts/src/compone ...
- 【Android】16.0 UI开发(七)——列表控件RecyclerView的点击事件实现
1.0 在各布局的基础上,修改ProvinceAdapter.java的代码: package com.example.recyclerviewtest; import android.support ...
- 微信小程序request请求之GET跟POST的区别
1.GET 例子: wx.request({ url: 'test.php', //仅为示例,并非真实的接口地址 data: { x: '' , y: '' }, header: { 'content ...
- js 闪动元素
<style> #div1{width:500px;height:100px;background:#888;font-size:5px;margin:0 auto;color:yello ...
- 核心API
1.ProcessEngine ProcessEngine是Activiti中最核心的类,其他的类都是由他而来.Activiti流程引擎的配置文件是名为 activiti.cfg.xml 的XML文件 ...
- 【阿里云产品公测】ACE下上传文件永久存储实践
本帖主要内容: ;$,=VB:' 在阿里云的ACE下,我是如何实现让上传的文件永久保存的? ,%"!8T 本文以PHP为例,具体知识点如下: WD# 96V 第一,扩展服务“存储 ...
- SQL点点滴滴_唯一索引设计指南-转载
唯一索引能够保证索引键中不包含重复的值, 从而使表中的每一行从某种方式上具有唯一性, 只有当唯一性是数据本身的特征时, 指定唯一索引才有意义. 例如, 如果您希望确保 HumanResources.E ...
- QT的键值对应关系 看完开发节省时间 哈哈
http://blog.csdn.net/wangjieest/article/details/8283656
- Centos如何通过yum安装php7
执行如下命令安装epel yum -y install epel-release 更换rpm源,请根据自己的centos版本选择相应的rpm源进行安装 Centos 5.X: rpm -Uvh ...
- January 29 2017 Week 5 Sunday
In order to be irreplaceable one must always be different. 若想无可替代,必须与众不同. If all your skills or pers ...