SQL优化策略
mysql添加索引
1、主键索引
LATER TABLE 'table_neme' ADD PRIMARY KEY('column');
2、唯一索引
unique空串(null)可以放多个 如果是具体的内容则不能重复
a: 肯定在where条经常使用 ;
b: 该字段的内容不是唯一的几个值(sex); (只有三个数据形成2级二叉树)
c: 字段内容不是频繁变化.
ALTER TABLE 'table_name' ADD UNIQUE ('column');
3、普通索引
ALTER TABLE 'table_name' ADD INDEX ('column');
4、全文索引(主要是针对对文件,文本的检索, 比如文章, 全文索引针对MyISAM有用)
ALTER TABLE 'table_name' ADD FULLTEXT ('column');
5、多列索引
ALTER TABLE 'table_name' ADD INDEX index_name('column1','column2','column3');
更详细的添加索引的方法
mysql中可以使用alter table这个sql语句来为表中的字段添加索引。
ALTER TABLE <表名> ADD INDEX <字段>;
ag:我们来尝试为test中t_name字段添加一个索引
alter table test add index(t_name);
这个会产生结果,t_name字段的key这一览由原来的空白变成了MUL.
这个的含义就是该列的值是可以重复的,该列是一个非唯一索引的签到列,或者是一个唯一索引的组成部分但是可以含空值NULL。
SQL优化分三个方面:
1、慢查询
2、索引
3、拆分表
SQL优化之索引:
1、在表中建立索引,优先考虑where、group by使用到的字段
2、尽量避免使用select *,返回无用的字段会降低查询效率。
优化方法:使用具体的字段代替*,只返回使用到的字段。
3、尽量避免使用in和not in,会导致数据库引擎放弃索引,进行全表扫描。
如下:SELECT * FROM t WHERE id IN(2,3)
SELECT * FROM t1 WHERE usename IN(SELECT username FROM t2)
优化方法:如果是连续数值,可以用between代替,如下:
SELECT * FROM t WHERE id BETWEEN 2 AND 3
如果是子查询,可以使用exists代替,如下:
SELECT * FROM t1 WHERE EXISTS (SELECT * FROM WHERE t1.username=t2.username);
4、尽量避免使用or,会导致数据库引擎放弃索引查询而进行全表扫描。如下:
SELECT * FROM t WHERE id = 1 OR id = 3;
优化方式:可以使用union代替or。如下:
SELECT * FROM t WHERE id = 1
UNION
SELECT * FROM t WHERE id = 3;
(ps:如果or两边的字段是同一个,如例子中的这样。貌似两者效率差不多,其实union扫描的索引,or扫描的是全表)
5、尽量避免在字段开头模糊查询,会导致数据库引擎放弃索引进行全表扫描,如下:
SELECT * FROM t WHERE username LIKE '%li%';
优化方式:尽量在字段后面使用模糊查询,如下:
SELECT * FROM t WHERE username LIKE 'li%';
6、尽量避免进行null值的判断,会导致数据可引擎放弃索引而进行全表扫描。如下:
SELECT * FROM t WHERE score IS NULL;
优化方式:可以给字段添加默认值0,对0值进行判断。
如下:
SELECT * FROM t WHERE score = 0;
7、尽量避免在where条件中等号的左侧进行表达式、函数操作,会导致数据库引擎放弃索引进行全表扫描。如下:
SELECT * FROM t2 WHERE SCORE/10 = 9;
SELECT * FROM t2 WHERE SUBSTR(USERNAME,1,2)='li';
优化方式:可以将表达式、函数操作移动到等号右侧。如下:
SELECT * FROM t2 WHERE score = 10*9;
SELECT * FROM t2 WHERE username LIKE 'li%';
8、当数据量大时,避免使用where 1=1的条件。通常为了方便拼装查询条件,我们会默认使用该条件,数据库引擎会放弃索引进行全表扫描。
如下:
SELECT * FROM t WHERE 1=1;
优化方式:用代码拼装sql时进行判断,没where加where,有where加and.
SQL优化之慢查询:
1)、数据库中设置sql慢查询
一、第一步,开启mysql慢查询
方式一:修改配置文件,在my.ini增加几行,主要是慢查询的定义时间(超过2秒就是慢查询),以及慢查询log日志记录(slow_query_log)
//定义超过多少秒的查询是慢查询,这里定义的是2秒
long_query_time=2
//记录下没有使用索引的query
long_query_not_using_indexes
第二步:通过mysql数据库开启慢查询
mysql->set global slow_query_log=ON
mysql->set global long_query_time = 3600
mysql->set global long_querise_not_using_indexes = ON
未完,待续
SQL优化策略的更多相关文章
- Spark SQL概念学习系列之Spark SQL 优化策略(五)
查询优化是传统数据库中最为重要的一环,这项技术在传统数据库中已经很成熟.除了查询优化, Spark SQL 在存储上也进行了优化,从以下几点查看 Spark SQL 的一些优化策略. (1)内存列式存 ...
- SQL优化策略高级优化经常使用-1(The Return Of The King)
1 经常使用的优化策略 1.1 语句 1.1.1使用实际的列名 当我们查询SQL语句时.你是否觉得使用实际的列名比使用*更快呢?答案是肯定的. 为了证实这一点,感兴趣的朋友能够自己验证一下.我这 ...
- sql优化策略之索引失效情况二
详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp63 接第一篇索引失效分析:http://grefr.iteye.co ...
- 47、Spark SQL核心源码深度剖析(DataFrame lazy特性、Optimizer优化策略等)
一.源码分析 1. ###入口org.apache.spark.sql/SQLContext.scala sql()方法: /** * 使用Spark执行一条SQL查询语句,将结果作为DataFram ...
- MySQL中的SQL的常见优化策略
MySQL中的SQL的常见优化策略 MySQL中的索引优化 MySQL中的索引简介 1 避免全表扫描对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索 ...
- 52 条 SQL 语句性能优化策略,建议收藏
本文会提到 52 条 SQL 语句性能优化策略. 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在where及order by涉及的列上建立索引. 2.应尽量避免在where子句中对字段进行nul ...
- Mysql 52条SQL语句性能优化策略汇总
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在where及order by涉及的列上建立索引. 2.应尽量避免在where子句中对字段进行null值判断,创建表时NULL是默认值,但大多数时候应 ...
- SQL语句性能优化策略
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 WHERE 及 ORDER BY 涉及的列上建立索引.2.应尽量避免在 WHERE 子句中对字段进行 NULL 值判断,创建表时 NULL 是默认 ...
- PHP中的数据库一、MySQL优化策略综述
前些天看到一篇文章说到PHP的瓶颈很多情况下不在PHP自身,而在于数据库.我们都知道,PHP开发中,数据的增删改查是核心.为了提升PHP的运行效率,程序员不光需要写出逻辑清晰,效率很高的代码,还要能对 ...
随机推荐
- python3速查参考- python基础 4 -> 元组 + 字典 + 字符串 的学习
元组 元组:特点就是内容不可变,算只读的列表,可以被查询,不能被修改 a = 2, print(a) print(type(a)) b = ('a','b','c') print(b[1]) 运行结果 ...
- openstack——Rabbitmq集群部署
一.前期准备 1.条件:准备3台Linux系统虚拟机,保持系统版本一致,确保配置好yum源,及网络源 2.3台虚拟机做静态解析 [root@yun1 ~]# cat /etc/hosts 12 ...
- JS小时倒计时
let t1 = new Date("2019-11-26 15:51:00");// 从什么时间开始 let t2 = ));// 延迟几个小时 let interval = w ...
- JAVA -----------交互式程序
2.6交互式程序 如果程序能在执行期间交互地从用户输入中读取数据,就可使程序每执行一次时计算出新结果,并且新结果取决于输入数据.这样的程序才具有实用性. 2.6.1 Scanner类 Scanner类 ...
- 上传本地文件到SVN
前言:今天按照自己的记忆上传本地文件夹到SVN,出现了点问题,重温了简单操作. https://blog.csdn.net/qq_35150366/article/details/81129847 参 ...
- 数据传输协议protobuf的使用及案例
一.交互流程图: 总结点: 问题:一开始设置http请求中content-type 设置为默认文本格式,导致使用http传输body信息的时候必须进行base64加密才可以传输,这样会导致增加传输1/ ...
- Linux_目录基本操作_常用命令【详解】
Linux_常用命令 Linux文件系统的目录树结构:[Linux世界里一切皆文件]:说白了,就是文件和文件夹(目录)之间的操作. 普通用户kkb所有文件及文件夹,其实都位于root用户的 /home ...
- Qt5笔记(一)
1. 只要指定父对象,直接或间接继承于QObect,那么子对象如果是动态分配空间,不需要手动释放内存,系统会自动释放.( Qt的内存回收机制) 2. 想要查看某个函数,可以F1进入帮助文档,连 ...
- 流程控制之 while 循环
目录 流程控制之while while 条件循环语句 while contine while else while 循环的嵌套 流程控制之while while 条件循环语句 循环就是一个重复的过程 ...
- iproute2使用及网络名称空间
创建一个网络名称空间: 相当于创建一个完全隔离的新网络环境,这个环境包括一个独立的网卡空间,路由表,ARP表,ip地址表,iptables,ebtables,等等.总之,与网络有关的组件都是独立的. ...