优先使用INNER JOIN

多表关联查询,扫描的行尽量少
        关联的时候下条件减少扫描的行数
SELECT
    ...
FROM
    ad_ad_summary_for_pos_eq sum4eq
INNER JOIN (SELECT id, NAME FROM wlw_area WHERE grade = 2) area ON area.id = position.city_id

避免使用SELECT * 
        你从你的表里返回每个列,甚至后期加的列。被传递到了线路上并被JDBC驱动器加载到 了内存中。如果你知道你只需要2-3列数据的话,这就造成了严重的IO和内存的浪费,对数据库执行计划的不良影响。《如何阻止SELECT
* 语句》 http://t.cn/RGmpdoJ,《Java开发者写SQL时常犯的10个错误》http://t.cn/RGm05ex

使用IN代替OR 
        两者结果是一样的,IN执行的速度比OR快,or的效率是n级别,in的消息时log(n)级别 ,in的个数建议控制在200以内《MySQL5.5
从零开始学》P197

如果可以尽量使用UNION ALL替代UNION
        UNION ALL执行所需要的时间少,确定查询结果中不会有重复的或不需要去重的优先使用ALL,《MySQL5.5 从零开始学》P223
OR改写为UNION
mysql的索引合并很弱智

select id from t where phone = ’159′ or name = ‘john’;

=>

select id from t where phone=’159′

union

select id from t where name=’jonh’


批量INSERT插入多条转为一条(分批次)

INSERT INTO t (id, nameVALUES(2,'Belle');
INSERT INTO t (id, nameVALUES(3,'Bernice');
----->
INSERT INTO t (id, nameVALUES(1,'Bea'), (2,'Belle'),(3,'Bernice');

分批次批量更新
        程序可以一次执行多条update语句

禁止不必要的ORDER BY排序
SELECT count(1) FROM user LEFT JOIN user_info i ON u.id = i.user_id WHERE 1 = 1 ORDER BY u.create_time DESC;
----->
SELECT count(1) FROM user LEFT JOIN user_info i ON u.id = i.user_id;

分组统计可以禁止排序
SELECT goods_id,count(*) FROM GROUP BY goods_id;
默认情况下,MySQL对所有GROUP BY col1,col2...的字段进行排序。如果查询包括GROUP BY,想要避免排序结果的消耗,则可以指定ORDER BY NULL禁止排序。
----->
SELECT goods_id,count(*) FROM GROUP BY goods_id ORDER BY NULL;

避免随机取记录
SELECT FROM t1 WHERE 1=1 ORDER BY RAND() LIMIT 4;
MySQL不支持函数索引,会导致全表扫描
----->
SELECT FROM t1 WHERE id >= CEIL(RAND()*1000) LIMIT 4;
   

不使用子查询而使用关联查询
    SELECT * FROM t1 WHERE id (SELECT id FROM t2 WHERE name='hechunyang');修改为:
    SELECT t1.* FROM t1 JOIN t2 ON t1.id = t2.id;
       子查询虽然可以使查询语句很灵活,但是执行效率不高。执行子查询时,MySQL需要为内层查询语句的查询结果建立一个临时表。然后外层查询语句从临时表中查询记录。查询完毕后,再撤销这些临时表。所以子查询的速度会受到一定的影响。如果查询的数据量比较大,这种影响就会随之增大。
        在MySQL中,可以使用JOIN查询替代子查询。JOIN查询不需要建立临时表,其速度比子查询要快,如果查询中使用索引的话,性能会更好。JOIN之所以更有效率,是因为MySQL不需要在内存中创建临时表来完成查询工作。

避免函数索引
    SELECT * FROM t WHERE YEAR(d) >= 2016;修改为:
    SELECT * FROM t WHERE d >= '2016-01-01';

避免数据类型不一致
    SELECT * FROM t WHERE id = '19';
    SELECT * FROM t WHERE id = 19;

使用load data导数据
        load
data比insert快约20倍

参考:
1. 《MySQL5.5 从零开始学》
2. 赶集mysql军规
3. http://t.cn/RGFvnbY【SQL语句常见优化十大案例】

MySQL语句高效写法整理的更多相关文章

  1. MySql语句常用命令整理---多表查询

    首先第一张表还是我们单表查询之前用到t_employee,我们在另外新建一个表t_dept(部门表)建表命令如下: drop table if exists t_dept; CREATE TABLE ...

  2. MySql语句常用命令整理---单表查询

    初始化t_employee表 创建t_employee表 -- DROP TABLE IF EXISTS test; CREATE TABLE t_employee ( _id INTEGER PRI ...

  3. php中mysql语句的基本写法

    php中mysql语句的基本写法 php作为一门后台语言必须要与mysql数据库打交道,做到将内容存储到数据库以及数据库数据读写的操作,那么下面就来说下最近学习的一些东西: 在具体将之前先说一下编码的 ...

  4. mysql语句在node.js中的写法

    总结一下mysql语句在node.js中的各种写法,参考了npm网站mysql模块给的实例. 查询 select //1 db.query('select * from tuanshang_users ...

  5. 常用的MySQL语句写法

    常用的MySQL语句写法 MySQL的SQL语句写法,除了那些基本的之外,还有一些也算比较常用的,这里记录下来,以便以后查找.     好记性不如烂笔头,这话说的太有道理了,一段时间不写它,还真容易忘 ...

  6. MySQL 语句整理 2019-5-3

    MySQL 语句整理 在整理完Oracle的一些常见用语句后,由于MySQL的语法跟Oracle略有不同,随跟PN的MySQL视频进行了间接整理. 查询薪水大于1800, 并且部门编号为20或30的员 ...

  7. python 全栈开发,Day60(MySQL的前戏,数据库概述,MySQL安装和基本管理,初识MySQL语句)

    一.MySQL的前戏 在学习Mysql之前,我们先来想一下一开始做的登录注册案例,当时我们把用户的信息保存到一个文件中: #用户名 |密码 root|123321 alex|123123 上面文件内容 ...

  8. MySQL隐式转化整理

    MySQL隐式转化整理 前几天在微博上看到一篇文章:价值百万的 MySQL 的隐式类型转换感觉写的很不错,再加上自己之前也对MySQL的隐式转化这边并不是很清楚,所以就顺势整理了一下.希望对大家有所帮 ...

  9. 让dede运行php代码和mysql语句

    一.dede运行php代码 举例1: {dede:name runphp='yes'} $str = "hello ";@me = $str;@me .= "world& ...

随机推荐

  1. SVN冲突解决

    问题一.执行SVN commit时候,会生成除正常文件之外.mine..r3439 ..r3368的三个文件 .mine:是自己要提交的版本 .r3439:在别人之前提交的版本 .r3368:初始版本 ...

  2. Mysql各种引擎原理实战对比

    1)存储引擎概述: (2)MySQL各大存储引擎: (3)InnoDB和MyIsam使用及其原理对比: (4)InnoDB和MyIsam引擎原理: (5)剩余引擎的使用DEMO(主要是Mrg_Myis ...

  3. Linux下常用的配置

    本文主要给出的都是一些常用的Linux配置,系统版本是基于CentOs6.3,供自己复习和新人学习,不当之处还请指正. vmware tools安装 虚拟机--->安装vmware tools ...

  4. Kafka生产者-向Kafka中写入数据

    (1)生产者概览 (1)不同的应用场景对消息有不同的需求,即是否允许消息丢失.重复.延迟以及吞吐量的要求.不同场景对Kafka生产者的API使用和配置会有直接的影响. 例子1:信用卡事务处理系统,不允 ...

  5. SpringMVC 教程 - Handler Method

    原文链接:https://www.codemore.top/cates/Backend/post/2018-04-21/spring-mvc-handler-methods 由注解@RequestMa ...

  6. Node.js 全局对象介绍

    全局对象 这些对象在所有模块里都可用.有些对象不是在全局作用域而是在模块作用域里,这些情况下面文档都会标注出来. global {Object} 全局命名空间对象. 浏览器里,全局作用域就是顶级域.如 ...

  7. MongoDB 固定集合

    MongoDB 固定集合(Capped Collections)是性能出色且有着固定大小的集合,对于大小固定,我们可以想象其就像一个环形队列,当集合空间用完后,再插入的元素就会覆盖最初始的头部的元素! ...

  8. render函数data参数中的model选项

    官方文档没有说, 但是编译v-model时, 是有model这个选项的, 例如: _c('el-input', { attrs: { "placeholder": "手机 ...

  9. Dynamics CRM 查找字段下拉的最多10个选项的排序规则

    原文链接来自DTCCh论坛http://dynamics.ms-talent.com.cn/bbs/content/?id=1406&catogory=CRM 如果你是从事dynamics c ...

  10. Android 内置群组,联系人

    这样一个需求,手机第一次启动的时候,需要内置一个群组,并且里面有给定的联系人信息, 本来打算写双进程守护的,结果昨天接到一个这样的任务,就先把它做了,发现里面有些操作数据库的东西还是值得看一下. 首先 ...