mysql数据库优化清理_mysql 数据库优化整理

内连接 -- inner join

内连接在不加on的情况下, 也是去求笛卡尔乘积. 不加on的用法并不推荐使用, 容易造成内存溢出的情况. 加on的时候, 在连表的时候, 就会对数据进行筛选, 以此来缩减有效数据范围。

select * from A inner join B; === select * from A,B; //交叉连接 -- 笛卡尔乘积  cross join

A的条数 * B的条数;

select * from A,B where A.uid=B.m_uid;  ===  select * from A inner join B as b on A.uid=B.m_uid;    //交叉连接 -- 笛卡尔乘积

外连接 -- left/right join on

这里加了一个on在上面, 因为不加on是会报错的.

left join 称之为左连接, 连接以左侧表数据为准, 当右表没有数据与之匹配的时候, 则会用null填补

right join 称之为右连接, 与 left join 相反, 这个是以右表为准.

常用索引:主键(唯一索引并且是主键,一张表智能有一个主键索引,PRIMARY KEY,AUTO_INCREMENT自增主键)

唯一索引:比方说身份证号 、手机号、登录用户名  必须不同,可以为空      create UNIQUE index index_mobile on index_table(mobile);

普通索引:index (最基础,没有特别)  create index index_name on index_table(name);

联合索引:create index index_union on index_table(name,age,mobile);

这里一个组合索引,相当于在有如下三个索引:

name;

name,age;

name,age,mobile;

这里或许有这样一个疑惑:为什么age或mobile或者age,mobile字段上没有索引。这是由于BTree索引因要遵守最左前缀原则。

1、选择索引列     where 后面出现的列 或join 后面出现的列

c22262c8b96a9199659c32622914ed20.png

709934640bf5c4380dfec2fb97a1d520.png

048b93eefeaed121efa5ed45a1fe0660.png

6c8c79522721447e59ac4ea95c017919.png

66fcb161db28e0d3e15fc7835366218c.png

0ce2e3e1c3866701ebb7a0e40715ca0c.png

48c54c203df8e7c801514df2638b7e32.png

42f03d3f2450b9d852265714abbe9c0a.png

054f051c74e09a134ebaecbd854711e8.png

da3be0406a50ea1212c4f483e20b1cc6.png

c5f98102926daa2e1ea299d376fa15fc.png

b71e73ee09de0ed9c6330d47d167b994.png

090f4c412fab7cc1a52ed7b227bfd028.png

f65376958f3323b55f55e86da4649c08.png

5acbc88debc124d9da1b7c57a1774909.png

注意:在建立联合索引时,where中没有name 时,没有用到索引;之前的六种情况都有用到。

ABC  AB  AC  BAC  CBA  CAB   A

只有BC,B,C这三种情况不能使用联合索引,使用索引情况不在乎顺序。

1.最左前缀匹配原则

mysql会一直向右匹配直到遇到范围查询(>、

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

a146c9cf49c0100593cba843be71ae08.png

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 子句只在以下的条件下使用索引:

lORDER BY中所有的列必须包含在相同的索引中并保持在索引中的排列顺序.

lORDER 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

1)用exists代替in

低效:

SELECT *

FROM EMP

WHERE EMPNO > 0

AND DEPTNO IN (SELECT DEPTNO

FROM DEPT

WHERE LOC = ‘MELB’)

高效:

SELECT *

FROM EMP

WHERE EMPNO > 0

AND EXISTS (SELECT ‘X’

FROM DEPT

WHERE DEPT.DEPTNO = EMP.DEPTNO

AND LOC = ‘MELB’)

2)用not exists代替not in

低效:

SELECT …

FROM EMP

WHERE DEPT_NO NOT IN (SELECT DEPT_NO

FROM DEPT

WHERE DEPT_CAT=’A’);

高效:

SELECT ….

FROM EMP E

WHERE NOT EXISTS (SELECT ‘X’

FROM DEPT D

WHERE D.DEPT_NO = E.DEPT_NO

AND DEPT_CAT = ‘A’);

3)用表连接代替exists

exits:

SELECT ENAME

FROM EMP E

WHERE EXISTS (SELECT ‘X’

FROM DEPT

WHERE DEPT_NO = E.DEPT_NO

AND DEPT_CAT = ‘A’);

表连接:

SELECT ENAME

FROM DEPT D,EMP E

WHERE E.DEPT_NO = D.DEPT_NO

AND DEPT_CAT = ‘A’ ;

4.清除不必要的排序

低效:

select count(*) from (select * from user where id > 40 order by id);

高效:

select count(*) from (select * from user where id > 40);

5.having -> where

避免使用HAVING子句, HAVING 只会在检索出所有记录之后才对结果集进行过滤. 这个处理需要排序,总计等操作. 如果能通过WHERE子句限制记录的数目,那就能减少这方面的开销.

低效:

select * from user group by id having id > 40;

高效:

select * from user where id > 40 group by id;

6.除非确实需要去掉重复的行,否则尽量使用union all而不是union。因为union会自带distinct操作,代价很大

使用explain查看sql性能

1.explain用法:在select之前加上explain即可。

例如:explain select * from test;

注意:explain并不会真正运行语句,而是只返回执行计划。

怎么看执行计划?一个简单的优化原则:令sql读取尽可能少的行。

2.实战案例1:

问题语句运行超过5s:

SELECT `branch`.`id`, `branch`.`name`, `branch`.`registered_time`, `branch_region`.`region_id`, `user`.`username`, `user`.`mobile`, count(o.order_id) as order_num

FROM (`branch`)

LEFT JOIN `user` ON `user`.`branch_id` = `branch`.`id`

LEFT JOIN `branch_role` ON `branch_role`.`id` = `user`.`role_id`

LEFT JOIN `branch_region` ON `branch_region`.`branch_id` = `branch_role`.`branch_id`

LEFT JOIN `orders` o ON `branch`.`id` = `o`.`supplier_id`

WHERE branch.id NOT IN (select supplier_id from signing where seller_id=6683 and status < 6)

AND `branch`.`group` = 'SUPPLIER'

AND `branch_role`.`flag` = 'ADMINISTRATOR'

AND `branch`.`status` = 'NORMAL'

GROUP BY `branch`.`id`

ORDER BY `branch`.`registered_time` desc

LIMIT 20;

使用explain查看执行计划:

134784d41d639edfa98139c6bcd9c009.png

根据“读取尽可能少的数据”的原则,发现读取行数最多的步骤读取了4792行。进而发现这个步骤没有用到索引(NULL)。而这个没有用索引的表是orders的supplier_id列。

加索引试试看:

alter table orders add index(supplier_id);

再次使用explain查看执行计划:

99ef8443bc854a5f9b33245666f1753a.png

可以看到这个步骤使用了索引,读取的行数减少到了599行。

实际执行一下,秒出。

3.explain执行计划各个字段的意义:

1)id:语句的执行顺序,倒序执行

2)select_type:主要有以下几个类型:

lsimple:表示简单的select,没有union和子查询

lprimary:最外层的select。在有子查询的语句中,最外面的select查询就是primary

lunion:union语句的第二个或者说是后面那一个

lunion result:union的结果

lsubquery: 子查询中的第一个 select

3)table:涉及的表。

4)type:连接类型。主要有以下几个:(重点查看)

lconst:说明只有一个匹配行,使用了主键或唯一性索引。通常是最优化的情况。

leq_ref,ref,ref_or_null:表示走了简单索引

lindex_merge:表示使用了多个索引的组合

lrange:表示通过索引取出了一个范围内的值。例如where a in (1,2)

lindex:表示对索引进行了全扫描

lALL:表示全表扫描

注意:以上类型从上到下性能越来越差。

5)possible_keys:可供使用的索引

6)keys:实际使用的索引

7)key_gen:索引长度

8)ref:显示使用哪个列或常数与索引一起从表中选择行

9)rows:读取的行数。(重点查看)

10)Extra:备注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/244165.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python38怎么用_Python基础练习实例38(数组操作)

题目&#xff1a;有一个已经排好序的数组。现输入一个数&#xff0c;要求按原来的从小到大顺序将它插入数组中。程序分析&#xff1a;首先判断此数是否大于最后一个数&#xff0c;然后再考虑插入中间的数的情况&#xff0c;插入后此元素之后的数&#xff0c;依次后移一个位置。…

python判断正数和负数教案_正数和负数 教学设计

《正数和负数 教学设计》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《正数和负数 教学设计(3页珍藏版)》请在人人文库网上搜索。1、1.1 正数与负数第一课时(一)概述课名是正数与负数&#xff0c;是义务教育课程标准实验教科书初中七年级的一堂数学课。本节课所需课…

修改pytho2安装插件的位置_office2016自定义安装以及修改安装位置

一、下载office2016专业增强版ed2k://|file|cn_office_professional_plus_2016_x86_x64_dvd_6969182.iso|2588266496|27EEA4FE4BB13CD0ECCDFC24167F9E01|/复制使用迅雷下载二、office2016部署工具部署工具地址​www.microsoft.com运行部署工具会生成setup.execonfiguration-Off…

vue 获取元素在浏览器的位置_前端开发JS获取页面元素的位置

1.网页的大小和浏览器窗口的大小一张网页的全部面积&#xff0c;就是它的大小。通常情况下&#xff0c;网页的大小由内容和document元素的clientHeight和clientWidth属性&#xff0c;就代表了网页的大小。function getViewport(){if (document.compatMode “BackCompat”){ret…

python 发送邮件不显示附件_python3发送邮件(无附件)

python3发送邮件代码&#xff1a;import smtplibfrom email.mime.text import MIMETextfrom email.utils import formatdate#设置服务器所需信息#163邮箱服务器地址mail_host smtp.163.com#163用户名mail_user h*****163.com#密码mail_pass h****password#邮件发送方邮箱地址…

小说是读者的艺术

小说的处境到了今天这个份上&#xff0c;该让我们的编辑和作家有点悔悟了&#xff0c;那就是光靠玩技巧和语言以及所有的花活唬不了读者&#xff0c;更救不了小说本身。我们知道一种艺术形式的存在很大程度上依赖于它的接受者的存在&#xff0c;所谓皮之不在&#xff0c;毛将存…

stright 在mysql_MySQL优化的奇技淫巧之STRAIGHT_JOIN

最近没怎么搞SQL优化&#xff0c;碰巧数据库被慢查询搞挂了&#xff0c;于是拿来练练手。问题通过「SHOW FULL PROCESSLIST」语句很容易就能查到问题SQL&#xff0c;如下&#xff1a;SELECT post.*FROM postINNER JOIN post_tag ON post.id post_tag.post_idWHERE post.status…

小说不“好看”,读者就给你“好看”

小说的病变和无可救药的衰竭是因为小说不好看 □主 持 人&#xff1a;兴 安 青年作家&#xff1a;丁 天 邱华栋 陆 涛 古清生 小说是什么&#xff1f;是“街谈巷议”———这是我们的老祖宗概括的&#xff0c;就是说它生于民间&#xff0c;是给更多的人看的&#x…

狗肉朋友

想想几年的圣诞聚会,朋友、哥们、同事、陌生人,每一年人走马灯似的变换,有的早在记忆中消失,如过眼烟云.而一直能保留下来的就那么几个朋友。 随着年龄的增长,自己在交往中纳新的能力和兴致越来越低,朋友的圈子越来越小,过去的那种结交天下豪杰的扩张心理没有了,守住故交,守住最…

mysql json坑_使用mysql innodb 使用5.7的json类型遇到的坑和解决办法

----------------------------------------------#查询JSON的某个字段select data -> ‘$.Host‘ from temp#创建虚拟列ALTER TABLE temp ADD host varchar(128) GENERATED ALWAYS AS (json_extract(data,‘$.Host‘)) VIRTUAL;#给虚拟列创建索引ALTER TABLE temp ADD INDEX…

恐怖小说之王——斯蒂芬·金 (转贴)

《宠物公墓》改编自斯蒂芬金的同名小说&#xff0c;在所有斯蒂芬金的恐怖小说里&#xff0c;恐怕就属这一部是最吓人的了。但斯蒂芬金的原著由于篇幅过长&#xff0c;难免有拖沓之感&#xff0c;当被改编成电影时&#xff0c;斯蒂芬金非常有效地压缩了与恐怖无关的枝节&#xf…

买了几张好碟

最喜欢的是《塔尔可夫斯基的全集》。以前有他零散的&#xff0c;几乎全了&#xff0c;可是看到整套的&#xff0c;包装又漂亮&#xff0c;声音又进化了5.1声道&#xff0c;确实没有理由不收啊。 《天下无贼》&#xff08;正版&#xff09;&#xff0c;《狂蟒之灾&#xff12;》…

mysql unix_timestamp 格式化_FROM_UNIXTIME 格式化MYSQL时间戳函数_MySQL

unix时间戳bitsCN.com函数&#xff1a;FROM_UNIXTIME作用&#xff1a;将MYSQL中以INT(11)存储的时间以”YYYY-MM-DD”格式来显示。语法&#xff1a;FROM_UNIXTIME(unix_timestamp,format)返回表示 Unix 时间标记的一个字符串&#xff0c;根据format字符串格式化。format可以包含…

酒喝高了,歌听多了

我常常忘记自己是蒙古人。昨天去了达尔汗蒙古风情餐吧&#xff0c;参加了蒙古的同乡会。AA制。好久没有参加这样的活动了&#xff0c;见到了些老面孔&#xff0c;大多是新面孔。有的胖了&#xff0c;有的老了&#xff0c;有的单身了&#xff0c;有的成双了&#xff0c;有的叫不…

抚摸斯蒂芬·金 (图)

<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />最近翻到一本美国恐怖小说大师斯蒂芬金的自传《抚摸恐怖——我的创作生涯》&#xff0c;珠海出版社2002年5月出版。书中披露了斯蒂芬金很多不为人知的写作经历以及对恐怖小说的看…

mysql设置定位慢查询_mysql优化——定位慢查询

1.定位慢查询1、show status 命令命令使用方式&#xff1a;show [session|global] status like slow_queries如果你不写 [session|global] 默认是session 会话&#xff0c;指取出当前窗口的执行&#xff0c;如果你想看所有(从mysql 启动到现在&#xff0c;则应该 global)执行s…

当我们年轻的时候 (转贴)

当我们年轻的时候 徐坤/文 这是一张十年前的照片。1996 年底&#xff0c;《小说月报》第7届百花奖发奖会在天津蓟县举行。获奖作者与编辑一应到达。左起&#xff1a;徐坤&#xff0c;刘醒龙&#xff0c;毕飞宇&#xff0c;李师东&#xff0c;李敬泽&#xff0c;兴安。 时值隆…

python 对象的异或运算符_python的运算符

算数运算符算数运算符主要用作于计算机的算数运算种类符号作用加法、字符串的拼接-减法*乘法、字符串的重复/除法//地板除(除法)%取余(除法)**幂运算# 数字类型的加法运算print(1 1) # 2print(False 1) # 1print(0j 1) # (10j)# 字…

希望我不会“伤心至死”

刚收到鬼古女的最新小说《伤心至死——万劫》。这好象是他的第三部长篇&#xff0c;上海人民出版社出版2005年10月出版。也是他《伤心至死》悬疑系列的第一部。我和鬼古女只在网上有过交流&#xff0c;据说这是一对旅居美国的神秘夫妇的笔名。我喜欢他的小说&#xff0c;曾写过…

同盟与对抗:谈《少女杜拉的故事》中的治疗关系(转)

《少女杜拉的故事》是弗洛伊德众多精神分析实例报告中最具代表性的一例。它记叙了弗洛伊德对杜拉神经症的治疗过程&#xff0c;从中我们可以了解到弗洛伊德精神分析学说的理论及运用。杜拉是一个18岁的女孩&#xff0c;她由于反复咳嗽、声嘶、呼吸困难而来就诊&#xff0c;弗洛…