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的运行效率,程序员不光需要写出逻辑清晰,效率很高的代码,还要能对 ...
随机推荐
- MATLAB学习(十)实现文件、图像读写
t=1:5; s1=sin(t); s2=cos(t); s=[t;s1;s2]; fid1=fopen('test.dat','wt'); fprintf(fid1,'\nThis is a For ...
- ProbCog[github]使用心得
1. After installing ProbCog,you can run blnquery and mlnquery. If the terminal warns that 'command n ...
- git学习教程二之远程仓库学习
首先你需要注册一个github用户名,我的github账户是:1654218052@qq.com 由于本地的git仓库和github的仓库是通过SSH加密的,所以我们还需要设置一点东西哦 第1步:创建 ...
- flask(1.1)装饰器装饰多个视图函数出现的问题
目录 1.装饰器装饰多个视图函数出现的问题 2.使用装饰器修复技术解决该问题 1.装饰器装饰多个视图函数出现的问题 代码实例: from flask import Flask, request, re ...
- Asp.net Core深入一:数据库访问(Mysql为例)
一.数据库概述 1.一个DBContext操纵一个数据库 2.DbContext下的一个DbSet<Model类>关联一个表,但是也可以只写一个表,DbContext可以关联其他的表. 3 ...
- POJ1988 Cube Stacking 【并查集】
题目链接:http://poj.org/problem?id=1988 这题是教练在ACM算法课上讲的一道题,当时有地方没想明白,现在彻底弄懂了. 题目大意:n代表有n个石头,M a, b代表将a石头 ...
- yum方式安装mono
https://blog.csdn.net/qq_21153619/article/details/81459359 这样应该比较简单 yum方式按照mono rpm --import "h ...
- 【LOJ】#3043. 「ZJOI2019」线段树
LOJ#3043. 「ZJOI2019」线段树 计数转期望的一道好题-- 每个点设两个变量\(p,q\)表示这个点有\(p\)的概率有标记,有\(q\)的概率到祖先的路径上有个标记 被覆盖的点$0.5 ...
- acm java入门(转载)
ACM中java的使用 http://www.cnblogs.com/XBWer/archive/2012/06/24/2560532.html 这里指的java速成,只限于java语法,包括输入输出 ...
- Python-基础-文件操作-随机存取
随机存取 文件操作中,read()和write()都属于顺序存取,只能按顺序从头到尾的进行读写.实际上我们可以只访问文件中我们感兴趣的部分.对此,我们可以使用seek()和tell()方法.两种方法的 ...