文档章节

mysql数据库sql优化原则

rin9958
 rin9958
发布于 2016/06/27 22:44
字数 699
阅读 43
收藏 13
点赞 0
评论 1

这里的原则 只是针对mysql数据库,其他的数据库 某些是殊途同归,某些还是存在差异。我总结的也是mysql普遍的规则,对于某些特殊情况得特殊对待。在构造sql语句的时候养成良好的习惯

原则1、仅列出需要查询的字段,这对速度不会明显的影响,主要是考虑节省应用程序服务器的内存。

原来语句: select * from admin
优化为: select admin_id,admin_name,admin_password from admin

原则2、尽量避免在列上做运算,这样导致索引失效

原语句: select * from admin where year(admin_time)>2014
优化为: select * from admin where admin_time> '2014-01-01'

原则3、使用JOIN 时候,应该用小的结果驱动大的结果(left join 左边表结果尽量小 如果有条件应该放到左边先处理,right join 同理反向),同事尽量把牵涉到多表联合的查询拆分多个query(多个连表查询效率低,容易到之后锁表和阻塞)

原来语句 select * from admin left join log on admin.admin_id = log.admin_id where log.admin_id>10
优化为: select * from (select * from admin where admin_id>10) T1 left join log on T1.admin_id = log.admin_id

原则 4、注意LIKE 模糊查询的使用, 避免使用 %% ,可以使用 后面带% ,双%是不走索引的

原来语句: select * from admin where admin_name like '%de%'
优化为: select * from admin where admin_name >='de' and admin_nam <'df' (注意不是等效的这里试试提供优化的思路)

原则5、使用批量插入节省交互 (当如如果使用存储过程来处理批量的sql 各种逻辑是更好的选择)

原来语句:
insert into admin(admin_name,admin_password) values ('test1','pass1');
insert into admin(admin_name,admin_password) values ('test2','pass2');
insert into admin(admin_name,admin_password) values ('test3','pass3')
优化为: 
insert into admin(admin_name,admin_password) values('test1','pass1'),('test2','pass2'),('test3','pass3')

原则6、limit 的基数比较大时使用between

原来语句:select * from admin order by admin_id limit 100000,10
优化为:  select * from admin where admin_id between 100000 and 100010 order by admin_id

原则7、不要使用rand函数获取多条随机记录

原来语句: select * from admin order by rand() limit 20
优化为: select * from admin as t1 Join(select round(rand()*((select max(admin_id) from admin)-(select min(id) from admin))+(select min(id) from admin)) as id) as t2 where t1.id>=t2.id order by t1.id limit

原则8、避免使用NULL

原则9. 不要使用 count(id) 使用 count(*)

原则10、不要做无谓的排序操作,而应该使用索引完成排序

数据库优化包括两个方面,一方面是sql 程序优化,另一方面是数据库配置的优化。另外在mysl 可以通过 以下语句来查看帮助sql进行优化

set @@profiling = 1;
select * from typecho_comments order mail limit 10,30;
show profiles;
show profile for query *

转载自:http://www.9958.pw/post/mysql_sql

© 著作权归作者所有

共有 人打赏支持
rin9958
粉丝 9
博文 113
码字总数 54109
作品 0
程序员
加载中

评论(1)

ericsoul
ericsoul
第一点,在大批量数据或者大吞吐量的情况下对速度的影响还是有的。10个字段和100个字段产生的io和net效果完全是俩码事,而且未指定列,sql引擎需要查一次meta表,把*变成所有列名
mysql优化sql语句

常见误区 误区1: count(1)和count(primary_key) 优于 count()    很多人为了统计记录条数,就使用 count(1) 和 count(primary_key) 而不是 count() ,他们认为这样性能更好, 其实这是一个...

南的糊途 ⋅ 2013/03/15 ⋅ 1

我的MySQL数据库SQL优化原则

一、前提 这里的原则只是针对MySQL数据库,其他的数据库某些是殊途同归,某些还是存在差异。我总结的也是MySQL普遍的规则,对于某些特殊情况得特殊对待。在构造SQL语句的时候要养成良好的习惯...

凯文加内特 ⋅ 2014/02/11 ⋅ 0

PHPer面试指南-MySQL 篇

本书的 GitHub 地址:https://github.com/todayqq/PHPerInterviewGuide 什么是索引,作用是什么?常见索引类型有那些?Mysql 建立索引的原则? 索引是一种特殊的文件,它们包含着对数据表里所...

angkee ⋅ 01/24 ⋅ 0

《高性能MySQL》第三章MySQL服务器性能剖析学习笔记

MySQL性能优化介绍 什么是性能优化呢?其实我们往往从广义的定义是觉得一个MySQL系统的非功能性的优化都会看作是性能优化,比如我们会将数据库服务器的稳定性、每秒执行的SQL查询数目、系统的...

杨武兵 ⋅ 2015/09/24 ⋅ 2

MYSQL性能调优

摘要 为了学习研究MySQL数据库在工作原理,深刻理解MySQL在企业运用时如何保证其高效运行。分别从表结构的优化,SQL语句的优化,存储引擎的选择,索引的优化以及现今MySQL的发展与其他企业级...

Edwyn王 ⋅ 2016/06/24 ⋅ 1

谈谈SQL慢查询的解决思路

最近,在运维部及DBA同事的帮助和大家的共同努力下,对项目中的慢SQL进行了优化和修正,效果还是很明显的,在此给大家点一个大大的赞。为了让我们在SQL的处理上更为合理,形成可实践、可借鉴...

谢东升Forest ⋅ 2017/08/03 ⋅ 0

MySQL优化原则

数据库已成为互联网应用必不可少的底层依赖,其中MySQL作为开源数据库得到了更加广泛的应用。最近一直专注于项目工程的开发,对开发过程中使用到的一些关于数据库的优化原则进行了总结,希望...

2k10 ⋅ 2015/03/23 ⋅ 0

MySQL · 性能优化 · 条件下推到物化表

背景 MySQL引入了Materialization(物化)这一关键特性用于子查询(比如在IN/NOT IN子查询以及 FROM 子查询)优化。 具体实现方式是:在SQL执行过程中,第一次需要子查询结果时执行子查询并将...

阿里云RDS-数据库内核组 ⋅ 2016/07/09 ⋅ 0

「mysql优化专题」这大概是一篇最好的mysql优化入门文章(1)

【mysql优化专题】:本专题全文围绕mysql优化进行全方位讲解,本篇为优化入门篇,让大家知道为什么要优化,究竟在优化什么。喜欢的朋友可以关注收藏。 优化,一直是面试最常问的一个问题。因...

java进阶架构师 ⋅ 2017/11/16 ⋅ 0

SQL-SQL优化-索引

图文并茂详解 SQL JOIN Join 是关系型数据库系统的重要操作之一,一般关系型数据库中包含的常用 Join:内联接、外联接和交叉联接等。如果我们想在两个或以上的表获取其中从一个表中的行与另一...

掘金官方 ⋅ 2017/12/25 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

那些证书相关的玩意儿(SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12等)

之前没接触过证书加密的话,对证书相关的这些概念真是感觉挺棘手的,因为一下子来了一大堆新名词,看起来像是另一个领域的东西,而不是我们所熟悉的编程领域的那些东西,起码我个人感觉如此,且很长...

颖辉小居 ⋅ 18分钟前 ⋅ 0

利用有限制通配符提升API灵活性(28)

1、参数化类型是不可变的 List<String> 不是List<Object>的子类,但是二者是有联系的 利用有限制的通配符类型处理类似情况 List<? extends Object>(生产者) Collection<? super E>(消费者......

职业搬砖20年 ⋅ 24分钟前 ⋅ 0

ssm框架 +bootstrap分页

这里有两种方式 方式一:自己写分页 方式二:使用插件PageHelper 1.自己写分页 1.1 效果 1.2 实现过程 1.2.1 创建分页公共类 //---------------------------1.属性-------------------------...

Lucky_Me ⋅ 31分钟前 ⋅ 0

Istio

helm template install/kubernetes/helm/istio --name istio --namespace istio-system > $HOME/istio.yaml after $ kubectl create namespace istio-system$ kubectl create -f $HOME/ist......

openthings ⋅ 31分钟前 ⋅ 0

内核线程、轻量级进程、用户线程

线程与进程概念 在现代操作系统中,进程支持多线程。 进程是资源管理的最小单元; 线程是程序执行的最小单元。 即线程作为调度和分配的基本单位,进程作为资源分配的基本单位 一个进程的组成...

117 ⋅ 37分钟前 ⋅ 0

elasticsearch2.4.6升级为elasticsearch-5.5.0的经历

将elasticsearch-5.5.0 中的配置 path.data 指向原来的数据路径 即 path.data: /usr/local/src/elasticsearch-2.4.6/data 注意: elasticsearch-5.5.0 需要将jdk版本升级到1.8...

晨猫 ⋅ 37分钟前 ⋅ 1

lvm讲解 磁盘故障小案例

1

oschina130111 ⋅ 41分钟前 ⋅ 0

那些提升开发人员工作效率的在线工具

本文转载自公众号 Hollis 作为一个Java开发人员,经常要和各种各样的工具打交道,除了我们常用的IDE工具以外,其实还有很多工具是我们在日常开发及学习过程中要经常使用到的。 Hollis偏爱使用...

时刻在奔跑 ⋅ 54分钟前 ⋅ 0

restful风格 实现DELETE PUT请求 的web.xml的配置

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframe......

泉天下 ⋅ 59分钟前 ⋅ 0

Shell数组

Shell数组 Shell在编程方面比Windows批处理强大很多,无论是在循环、运算。 bash支持一维数组(不支持多维数组),并且没有限定数组的大小。类似与C语言,数组元素的下标由0开始编号。获取数...

蜗牛奔跑 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部