mysql语句优化原则
有时候发现数据量大的时候查询起来效率就比较慢了,学习一下mysql语句优化的原则,自己在正常写sql的时候还没注意到这些,先记录下来,慢慢一点一点的学,加油!
这几篇博客写的都可以:
https://blog.csdn.net/s1547823103/article/details/79205670
https://blog.csdn.net/u011277123/article/details/78904569
使用索引的原则:
1.最左前缀匹配原则。
mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配。所以要尽量把“=”条件放在前面,把这些条件放在最后。
不会用到b的索引:
where a=1 and c>0 and b=2
会用到b的索引:
where a=1 and b=2 and c>0
2.尽量选择区分度高的列作为索引,区分度的公式是count(distinct col)/count(*),表示字段不重复的比例,比例越大我们扫描的记录数越少。
3.当取出的数据超过全表数据的20%时,不会使用索引。
4.使用like时注意:
不使用索引:
like ‘%L%’
使用索引:
like ‘L%’
5.尽量将or 转换为 union all
不使用索引:
select * from user where name=’a’ or age=’20’
使用索引:
select * from user where name=’a’ union all select * from user where age=’20’
6.字段加函数不会使用索引。所以尽量把函数放在数值上
不使用索引:
where truncate(price) = 1
使用索引:
where price > 1 and price < 2
7.如果使用数字作为字符,则数字需要加引号,否则mysql会自动在列上加数据类型转换函数
不使用索引
where mobile=18534874321
使用索引
where mobile=’18534874321’
8.字段加运算符不会使用索引。所以尽量把运算放在数值上
不使用索引:
SELECT ACCOUNT_NAME, AMOUNT FROM TRANSACTION WHERE AMOUNT + 3000 >5000;
使用索引:
SELECT ACCOUNT_NAME, AMOUNT FROM TRANSACTION WHERE AMOUNT > 2000 ;
9.使用组合索引时,必须要包括第一个列。
例如
alter table test add index(a,b,c):
不使用索引:
where b=1, c=2
where b=1
where c=2
使用索引:
where a=1, b=1, c=2
where a=1, b=1
where a=1, c=2
10.尽量避免使用is null或is not null
不使用索引:
SELECT … FROM DEPARTMENT WHERE DEPT_CODE IS NOT NULL;
使用索引:
SELECT … FROM DEPARTMENT WHERE DEPT_CODE >0;
11.不等于(!=)不会使用索引
不使用索引:
SELECT ACCOUNT_NAME FROM TRANSACTION WHERE AMOUNT !=0;
使用索引:
SELECT ACCOUNT_NAME FROM TRANSACTION WHERE AMOUNT >0;
12.ORDER BY 子句只在以下的条件下使用索引:
ORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序.
ORDER BY中不能既有ASC也有DESC
例如:
alter table t1 add index(a,b);
alter table t1 add index(c);
不使用索引:
select * from t1 order by a,c; 不在一个索引中
select * from t1 order by b; 没有出现组合索引的第一列
select * from t1 order by a asc, b desc; 混合ASC和DESC
select * from t1 where a=1 order by c; where和order by用的不是同一个索引,where使用索引,order by不使用。
使用索引:
select * from t1 order by a,b;
select * from t1 order where a=1 order by b;
select * from t1 order where a=1 order by a,b;
select * from t1 order by a desc, b desc;
select * from t1 where c=1 order by c;
13.索引不是越多越好。mysql需要资源来维护索引,任何数据的变更(增删改)都会连带修改索引的值。所以,需要平衡考虑索引带来的查询加速和增删改减速。
其他注意事项
1.尽量避免使用select *
2.尽量使用表连接(join)代替子查询select * from t1 where a in (select b from t2)
3.性能方面,表连接 > (not) exists > (not) in
mysql语句优化原则的更多相关文章
- php代码优化,mysql语句优化,面试需要用到的
首先说个问题,就是这些所谓的优化其实代码标准化的建议,其实真算不上什么正真意义上的优化,还有一点需要指出的为了一丁点的性能优化,甚至在代码上的在一次请求上性能提升万分之一的所谓就去大面积改变代码习惯, ...
- MySql基础笔记(二)Mysql语句优化---索引
Mysql语句优化--索引 一.开始优化前的准备 一)explain语句 当MySql要执行一个查询语句的时候,它首先会对语句进行语法检查,然后生成一个QEP(Query Execution Plan ...
- Mysql语句优化
总结总结自己犯过的错,网上说的与自己的Mysql语句优化的想法. 1.查询数据库的语句的字段,尽量做到用多少写多少. 2.建索引,确保查询速度. 3.orm框架自带的方法会损耗一部分性能,这个性能应该 ...
- MySQL 索引优化原则
一.索引优化原则 1.最左前缀匹配原则,联合索引,mysql会从做向右匹配直到遇到范围查询(>.<.between.like)就停止匹配,比如a = 1 and b = 2 and c & ...
- Mysql 语句优化技巧
前言 有人反馈之前几篇文章过于理论缺少实际操作细节,这篇文章就多一些可操作性的内容吧. 注:这篇文章是以 MySQL 为背景,很多内容同时适用于其他关系型数据库,需要有一些索引知识为基础. 优化目标 ...
- mysql数据库优化原则
一.一个例子 数据库需要处理的行数: 189444*1877*13482~~~479亿 如果在关联字段上加上合适的索引: 数据库需要处理的行数:368006*1*3*1~~~110万 MySQL通常是 ...
- mysql语句优化总结(一)
Sql语句优化和索引 1.Innerjoin和左连接,右连接,子查询 A. inner join内连接也叫等值连接是,left/rightjoin是外连接. SELECT A.id,A.nam ...
- mysql语句优化方案(网上流传)
关于mysql处理百万级以上的数据时如何提高其查询速度的方法 最近一段时间由于工作需要,开始关注针对Mysql数据库的select查询语句的相关优化方法. 由于在参与的实际项目中发现当mysql表的数 ...
- Mysql语句优化建议
一.建立索引 1)考虑在 where 及 order by 涉及的列上建立索引 2)对于模糊查询, 建立全文索引 3)对于多主键查询,建立组合索引 二.避免陷阱 然而,一些情况下可能使索引无效: 1) ...
随机推荐
- WPF中的多进程(Threading)处理实例(一)
原文:WPF中的多进程(Threading)处理实例(一) 说明:希望通过揣摩这些案例,能进一步了解进程的工作原理. 1.方法一描述的是在同一窗口中,在计算素数的同时而不影响Canvas的工作. 方法 ...
- SEED缓冲区溢出实验笔记——Return_to_libc
参考:http://www.cis.syr.edu/~wedu/seed/Labs_12.04/Software/Return_to_libc/ http://drops.wooyun.org/ ...
- mysql 服务压缩包安装,用户创建
wind7上安装mysql记录: 1.下载的包中没有ini配置文件,需要根目录手动创建my.ini文件 内容如下: [client]port=3306default-character-set=utf ...
- delphi读取ini文件
ini文件在系统配置及应用程序参数保存与设置方面,具有很重要的作用,所以可视化的编程一族,如vb.vc.vfp.delphi等都提供了读写ini文件的方法,其中delphi中操作ini文件,最为简洁, ...
- Linux中的进程
进程,线程,程序 通俗的说,进程是程序的一次执行过程,程序是一种静态概念,如果在系统中引入线程,则进程是资源分配单元,线程是系统执行单元.此处不懂应参阅<操作系统> 进程衍生 fork-e ...
- Webpack Waringing Critical dependencies
报错信息如下: 出错原因先上图: 未注释部分使用了require的同时使用了es6的语法. 官方解释如下: 解决方法就是放开代码中的注释部分,不要使用es6语法
- Nginx 部署 Ant Design pro
利用Ant Design pro开发的项目,如何用Nginx部署呢? 第一步:把项目打包,打包命令如下: npm run build 运行完毕会在项目目录下生成dist文件夹. 第二步:想要测试打包好 ...
- 函数式编程里的Materialization应该翻译成什么?
Materialization是函数式编程里的一个专业术语, 用于特指函数式编程中查询被实际执行并生成结果的这一过程. 首先, 搜了一下中文资料, 暂时没有对该词的中文翻译, CSDN\博客园\阿里 ...
- HTML连载11-HTML中被废弃的标签&字符实体
一.为什么会有被废弃的标签 答:HTML中以前存在一部分不是用来添加语义的标签,而与我们HTML标签是用来添加语义的,这与我们的定义不相符. 例如: 1.标签<br>:换行 2.标签&l ...
- hgoi#20190514
T1-Curriculum Vitae 给你一个长度为n的01序列a,删去其中的几个数,使得序列中左边是连续的0,右边是连续的1,可以没有0或1,求最多剩下几个数 解法 对于每个点看它左边几个0,右边 ...