内连接 -- 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 后面出现的列

注意:在建立联合索引时,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

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查看执行计划:

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

加索引试试看:

alter table orders add index(supplier_id);

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

可以看到这个步骤使用了索引,读取的行数减少到了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:备注

mysql数据库优化清理_mysql 数据库优化整理相关推荐

  1. mysql数据库优化大全_MySQL数据库优化技巧大全

    简介: MySQL数据库优化技巧大全 MySQL优化三大方向 ① 优化MySQL所在服务器内核(此优化一般由运维人员完成). ② 对MySQL配置参数进行优化(my.cnf)此优化需要进行压力测试来进 ...

  2. mysql数据库前端缓存_MySQL数据库性能优化--缓存参数优化

    在平时被问及最多的问题就是关于 MySQL 数据库性能优化方面的问题,所以最近打算写一个MySQL数据库性能优化方面的系列文章,希望对初中级 MySQL DBA 以及其他对 MySQL 性能优化感兴趣 ...

  3. mysql 查找数据过程_mysql数据库查询过程探究和优化建议

    查询过程探究 我们先看一下向mysql发送一个查询请求时,mysql做了什么? 如上图所示,查询执行的过程大概可分为6个步骤: 客户端向MySQL服务器发送一条查询请求 服务器首先检查查询缓存,如果命 ...

  4. MySQL数据库sql分类_mysql数据库常用sql的分类整理

    **************************************************************************************************** ...

  5. Linux的MySQL用户编程使用_MySQL数据库在linux的安装,编程与操作

    来自:http://blog.csdn.net/lxh090821/article/details/9410943 1       登录数据库 格式: MySQL -h主机地址 -u用户名 -p用户密 ...

  6. mysql数据库blob换行_mysql数据库blob类型

    Java -- JDBC 学习--处理Blob Oracle LOB LOB,即Large Objects(大对象),是用来存储大量的二进制和文本数据的一种数据类型(一个LOB字段可存储可多达4GB的 ...

  7. mysql主流产品介绍论文_MySQL数据库产品介绍

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  8. mysql性能优化教程_mysql性能优化教程

    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],&q ...

  9. mysql+date+范围+性能_MySQL性能优化的最佳20+条经验

    今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数据 ...

最新文章

  1. 元素多层嵌套,JS获取问题
  2. 华为推CPU Turbo,荣耀Note10突破3000档
  3. django的ajax_get请求
  4. C 常见的面试知识点(下)
  5. 【重难点】【Java集合 02】Set、List、Map 的区别、常见的线程安全的集合类、Collection 为什么只能在 Iterator 中删除元素
  6. android 自定义view 实现电影选座功能
  7. 华为nova2s应用计算机,华为nova2s 如何打开多个应用 | 手游网游页游攻略大全
  8. 三星+android+u盘模式,三星安卓机,如何开启开发者模式,进行USB调试?
  9. html炫酷在线,10款基于HTML5/CSS3的炫酷动画
  10. 如何进行AI换脸,AI换脸从 “0“ 到 “1” 详细教程 ——从配置环境开始
  11. round函数c语言,fegetround
  12. 实现文字后面加一条横线的效果
  13. 理论总结-三次样条插值
  14. win7 svchost.exe 占用内存cpu过高
  15. 华为笔记本电脑锐龙版和LINUX版的区别,华为 MateBook 13 锐龙版笔记本电脑新鲜评测...
  16. 51汇编——LCD1602显示
  17. 微信支付接口--支付成功的回调--超详细Demo
  18. 9种免费图像优化工具
  19. 3dmath 直线于圆柱的交点(无限长圆柱)
  20. 4+1口语语汇笔记7

热门文章

  1. 快速的CSV文件生成器
  2. 请求页式存储管理中页面置换算法的模拟设计_操作系统-存储管理与文件管理-笔记...
  3. java自动装箱和拆箱_关于java自动装箱和自动拆箱
  4. springboot取yml中的值_@Value拜拜:更优雅的获取springboot yml中的值
  5. php sqlsrv 下载,php_sqlsrv_ts.dll,下载,简介,描述,修复,等相关问题一站搞定_DLL之家...
  6. 深度学习之自编码器(2)Fashion MNIST图片重建实战
  7. 深度学习之卷积神经网络(12)深度残差网络
  8. python自然语言的背景_PYTHON 自然语言处理
  9. 『设计模式』写代码偷懒小技巧,程序开发大智慧--享元模式
  10. 数据结构-循环单链表之约瑟夫问题