优先使用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. Docker安装tomcat和部署项目

    随着微服务的流行,Docker越来越流行,正如它的理念"Build, Ship, and Run Any App, Anywhere"一样,Docker提供的容器隔离技术使得开发人 ...

  2. (一)python基础知识

    Python:解释型语言(一边翻译一边运行)注释:单行注释(#).多行注释(ctrl+/):''' '''和""" """ (python2 ...

  3. 如果将Joomla网站搜索结果显示到一个“干净”页面

    有时候大家会发现Joomla网站自带的或者第三方的搜索功能时,搜索结果会显示在首页,和首页其它的模块如图片橱窗等显示在一起,非常混乱. 在这里教大家一个不需要修改代码的小技巧来解决这个问题,使搜索结果 ...

  4. Docker配置 DNS

    Docker 没有为每个容器专门定制镜像,那么怎么自定义配置容器的主机名和 DNS 配置呢? 秘诀就是它利用虚拟文件来挂载到来容器的 3 个相关配置文件. 在容器中使用 mount 命令可以看到挂载信 ...

  5. gdb不知为何显示2次析构

    gdb不知为何显示2次析构 (金庆的专栏 2016.11) gdb 显示2次 A::~A(): (gdb) bt #0 A::~A (this=0x602010, __in_chrg=<opti ...

  6. 安卓高级6 CoordinatorLayout

    原作者大神地址:http://blog.csdn.net/huachao1001/article/details/51554608 曾在网上找了一些关于CoordinatorLayout的教程,大部分 ...

  7. android混淆那些坑

    ProGuard简介 在最新的Android Studio 2.2.2版本创建的Android工程中,module中的build.gradle有如下一段配置.这里的minifyEnabled即用来控制 ...

  8. Android开发学习之路--Drawable mutations

      时间过得很快,明天终于可以拿到房子了,交完这次房租,也可以成为房东了,看看博客也好久没有更新了,最近一直在整机器人,也没有太多时间整理博客.   今天下午和同事一起遇到了一个问题,就是明明没有改变 ...

  9. UIKit中ImageView动画堆叠显示的微调整

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 网上看到一个PackingList项目(如果需要源代码可以Q我 ...

  10. PAM30 模拟登陆 投票

    Python真的是让人爱不释手啊,一直以来都不知道如何自动投票,然而今天有幸看到了PAM30,下面谈一谈我一个小案例吧. 准备 PAM30下载地址 编码前注意 由于一开始没有什么概念,还以为是个第三方 ...