掌握必要的sql优化知识对于程序员来说是必须的,因为各种程序本质来说就是对数据的处理,无非就是简单的增删改查和复杂的增删改查而已,所以对于数据的分析处理是非常重要的
首先推荐一本书<深入浅出MYSQL>,由网易DBA团队编写,写的非常好,感兴趣的朋友可以买来看看
下面介绍sql优化:
1.主键查询
查询尽量使用主键查询,因为有主键索引
其它索引后面介绍
2.合理使用字段,及字段长度
原则就是能保证存储要求,也需预留空间
如果字段长度过长,会增加不必要的空间
例如邮政编码字段,显然VARCHAR(6)就行了,不需要VARCHAR(255)
3.尽量使用join关联查询替代子查询
子查询就是将一个查询的结果作为另一个查询的条件或者要查询的表再次查询
这样查询本质上属于两次查询了,mysql会创建临时表来存储第一次查询结果,这样会消耗空间
每次查询都是要消耗资源的,所以这种效率不是很好
数据量小看不出来,数据量大的话使用关联查询速度更快,可以去试验
如果子查询非要用的话,最好只出现一次,出现两次或以上严重影响效率,因为计算机会对sql语句生成执行计划,再去执行,如果子查询过多,人都看晕了,同样计算机识别语句的意思,然后生成执行计划也会慢很多
4.网上看到有说使用外键的,工作中从来没用过外键,这种说法不行,现在都是快速开发
外键的作用被业务层取代了,直接写在代码中
用外键不易修改/删除数据,很麻烦,实际开发中也很少/几乎没有公司使用外键
所以该方法不可取
5.少写或不写select * ,要什么字段就取什么字段
6.查询缓存的使用
mysql默认是开启查询缓存了
就是说相同的查询,第二次会直接访问缓存结果
但是有些sql中的函数如now(),这种是时时变化的,写在sql语句中不会开启查询缓存
所以在sql中可不使用这些函数就不使用,用变量传入sql中,这样就开启缓存了
7.当只要一行数据时使用limit 1,mysql数据库引擎会在找到一条数据后停止搜索,而不是继续往后查找下一条符合的数据,如果需的数据不是很多,但是返回量很大的时候也要使用limit限制返回量
8.使用EXPLAIN + 查询语句可以知道sql语句执行的信息
可以看出查询扫描类型,这个后面介绍
也可以直接在客户端navicat查看概况,里面会显示查询时间主要消耗在哪里...
9.在比如数据量小且固定的情况下,如性别,省市区等等,可以使用ENUM字段(枚举),ENUM 类型是非常快的,它实际上保存的是TINYINT,但其外表上显示为字符串..
10.复杂sql语句的拆分与避免锁表
在访问量很高的项目中/特别是互联网项目中尽量避免写复杂的sql语句,因为复杂的sql语句执行时间相对而言要长,会造成锁表,就是说当前sql执行的这段时间,别的sql不能操作该表,在访问量很高的网站上,这时就会有大量的sql操作请求积累在数据库中,这样很可能数据库就崩了
11.建立索引(重点)
这个是最重要的,因为不用索引和用索引的查询速度相差了几十倍
如果不用索引,mysql会从第一条数据开始读取,读完整张表然后获取需要的数据
用了索引,mysql会按照索引快速的到一个位置去手搜索数据
就把索引比作字典前面那些拼音笔画索引,显然用这个查比你拿着字典从第一页一页页的翻要快的多
但是如果你获取的是大部分数据,这时就是顺序读取要快了
索引分类:
主键索引
唯一索引
普通索引
最合适索引字段是常用于在where语句后的字段,也就是查询条件
字段中值基数越大,越不同,索引效果越好,如果数据量小且值又很多相同的,效果就不明显,就不需要用索引了
不要过度索引,因为额外的索引都是要占用磁盘空间的,修改表数据时,索引必然是要更新的,这样也是要浪费时间的,还有sql生成执行计划的时候也会考虑各个索引,这样看来多余的索引反而不好,不利于查询优化
12.EXPLAIN + 查询语句分析
可以看到type:访问类型,key:实际使用的索引,rows:扫描的行数
可以检查设置的索引有没有用到,扫描行数越少显然速度越快了
访问类型就是mysql是怎么找到所需的数据的
type分类:
all:
全表扫描,就是mysql从第一条数据开始,一条条查询
index:
索引全扫描,就是遍历整个索引查找
如:select title from film
title上有索引,但是根据的是所有的索引去查询的数据,这没能很好体现索引的效果
range:
索引范围扫描,常用于<,<=,>,between等操作符,就是设定索引值的范围
如:select * from payment where customer_id <= 350
ref:
使用非唯一性索引匹配单个值然后返回
非唯一索引相对唯一索引而言的,唯一索引包括主键和设置其它唯一索引
如:select * from payment where customer_id = 350
eq_ref:
类似ref,但是使用的是唯一索引,对于每个索引键值,表中只一条记录匹配,简单的说就是多表连接中使用主键或者唯一性索引字段作为关联条件
const/system:
最多匹配到一条数据
就是根据主键或者唯一性索引字段来查询单表,速度最快

转载于:https://www.cnblogs.com/jaro/p/8862165.html

01-sql优化及索引相关推荐

  1. SQL优化中索引列使用函数之灵异事件

    SQL优化中索引列使用函数之灵异事件 在SQL优化内容中有一种说法说的是避免在索引列上使用函数.运算等操作,否则Oracle优化器将不使用索引而使用全表扫描,但是也有一些例外的情况,今天我们就来看看该 ...

  2. 霜皮剥落紫龙鳞,下里巴人再谈数据库SQL优化,索引(一级/二级/聚簇/非聚簇)原理

    举凡后端面试,面试官不言数据库则已,言则必称SQL优化,说起SQL优化,网络上各种"指南"和"圣经"难以枚举,不一而足,仿佛SQL优化已然是妇孺皆知的理论常识, ...

  3. SQL优化:索引优化

    SQL索引 SQL索引在数据库优化中占有一个非常大的比例, 一个好的索引的设计,可以让你的效率提高几十甚至几百倍,在这里将带你一步步揭开他的神秘面纱. 1.1 什么是索引? SQL索引有两种,聚集索引 ...

  4. MySQL高级篇(SQL优化、索引优化、锁机制、主从复制)

    目录 0 存储引擎介绍 1 SQL性能分析 2 常见通用的JOIN查询 SQL执行加载顺序 七种JOIN写法 3 索引介绍 3.1 索引是什么 3.2 索引优劣势 3.3 索引分类和建索引命令语句 3 ...

  5. MySQL数据库:SQL优化与索引优化

    一.索引优化: 1.like语句的前导模糊查询不使用索引: select * from doc where title like '%XX':   --不能使用索引 select * from doc ...

  6. 记一次sql优化之索引的引用

    sql 优化时,一张200条数据的表,觉得数据量太少根本无须加索引,在一长段sql 优化无果后,发现这张表被频繁分组引用了四次,在外键加上索引后,成功优化... 所以数据量少的表,被频繁引用也需要加索 ...

  7. sql优化和索引常见的面试题(面试总结)

    1.什么是索引 索引指数据库的目录,比如:字典上面的字母目录 (适用于大数据量) 2.建立索引的优缺点 优点:查询速度快 缺点:增删改慢,因为数据库要同步去维护索引文件,所以速度慢 3.索引有哪些 普 ...

  8. SQL优化避免索引失效

    Oracle 索引的目标是避免全表扫描,提高查询效率,但有些时候却适得其反.例如一张表中有上百万条数据,对某个字段加了索引,但是查询时性能并没有什么提高,这可 能是 oracle 索引失效造成的.or ...

  9. SQL优化之索引优化

    索引优化 1. 分析SQL执行的性能 ​ 使用explain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理SQL语句的.分析所编写的查询语句或是表结构的性能瓶颈. 具体语法: E ...

  10. 以小博大外小内大,Db数据库SQL优化之小数据驱动大数据

    SQL优化中,有一条放之四海而皆准的既定方针,那就是:永远以小数据驱动大数据.其本质其实就是以小的数据样本作为驱动查询能够优化查询效率,在SQL中,涉及到不同表数据的连接.转移.或者合并,这些操作必须 ...

最新文章

  1. 前端调用mysql异步_PHP 使用 Swoole – TaskWorker 实现异步操作 Mysql
  2. 史玉柱:10个企业管理智慧,成功的企业都这么做
  3. VCenter电源报警
  4. PyCharm 安装详细图片(linux)版
  5. AI公开课:19.03.20吴甘沙-驭势科技联合创始人《AI时代的自动驾驶趋势》课堂笔记以及个人感悟
  6. 实验-网页动画(js版)
  7. Android应用安装apk版本升级,适配Android 8.0和Android 10.0下载安装,shell命令安装APK
  8. sublime3运行python_sublime中按ctrl+B调用python3运行
  9. SURF特征提取分析(一)
  10. vue跨域使用websocket_在vue中使用SockJS实现webSocket通信的过程
  11. TIM-VX编译体验
  12. html写简历怎么导出pdf,简历在线生成,在线生成PDF或word格式简历
  13. HTML的font标签的使用
  14. 百度糯米 android,百度糯米安卓版|百度糯米for android官方手机版 6.7.1 - 系统天堂...
  15. 今后,若你的公众号还按老方式发广告,罚款高的可达百万。有公众号已经被惩处了。
  16. 【烈日炎炎战后端】Nginx(0.3万字)
  17. 主成分分析——PCA
  18. xPad该歇了,我们需要的只是小尺寸触控显示器
  19. 2020 年 12 月编程语言排行榜
  20. 忽然看到自己十年前发的关于转计算机专业的帖子

热门文章

  1. CVE-2015-3636(pingpong root) android内核 UAF漏洞分析
  2. centos6.x 安装elasticsearch6.x步骤
  3. JZOJ 5484. 【清华集训2017模拟11.26】快乐树
  4. GDOI2017 旅游记
  5. php imap配置,php中的自定义IMAP命令
  6. ros安装-Ubuntu14.04
  7. centos安装llvm_CentOS 7.0 编译安装LLVM7.0.0版本
  8. fpga项目开发实例_深入浅出玩转FPGA书+视频教程:35课时+源码
  9. Endnote X3 出现中文乱码
  10. 【NOI2013模拟】棋盘游戏