美文网首页嵌牛IT观察
数据库学习(三)

数据库学习(三)

作者: 大猫_23fe | 来源:发表于2018-07-06 14:26 被阅读0次

顾颖17021223250

转载自https://blog.csdn.net/kry12/article/details/80928711

【嵌牛导读】:mysql优化的一些基本语法

【嵌牛鼻子】:MySQL优化

【嵌牛提问】:如何用语句优化mysql功能?

【嵌牛正文】:

1.慢SQL消耗了70%~90%的数据库CPU资源;

2.SQL语句独立于程序设计逻辑,相对于对程序源代码的优化,对SQL语句的优化在时间成本和风险上的代价都很低;

3.SQL语句可以有不同的写法;

下面是我总结的一些SQL常见的优化方法,每个案例都简单易懂,在开发过程中可以作为参考:

不使用子查询

例:SELECT * FROM t1 WHERE id (SELECT id FROM t2 WHERE name='hechunyang');

子查询在MySQL5.5版本里,内部执行计划器是这样执行的:先查外表再匹配内表,而不是先查内表t2,当外表的数据很大时,查询速度会非常慢。

在MariaDB10/MySQL5.6版本里,采用join关联方式对其进行了优化,这条SQL会自动转换为

SELECT t1.* FROM t1 JOIN t2 ON t1.id = t2.id;

但请注意的是:优化只针对SELECT有效,对UPDATE/DELETE子查询无效,固生产环境应避免使用子查询

避免函数索引

例:SELECT * FROM t WHERE YEAR(d) >= 2016;

由于MySQL不像Oracle那样支持函数索引,即使d字段有索引,也会直接全表扫描。

应改为

SELECT * FROM t WHERE d >= '2016-01-01';

用IN来替换OR

低效查询

SELECT * FROM t WHERE LOC_ID = 10 OR LOC_ID = 20 OR LOC_ID = 30;

高效查询

SELECT * FROM t WHERE LOC_IN IN (10,20,30);

LIKE双百分号无法使用到索引

SELECT * FROM t WHERE name LIKE '%de%';

SELECT * FROM t WHERE name LIKE 'de%';

目前只有MySQL5.7支持全文索引(支持中文)

读取适当的记录LIMIT M,N

SELECT * FROM t WHERE 1;

SELECT * FROM t WHERE 1 LIMIT 10;

避免数据类型不一致

SELECT * FROM t WHERE id = '19';

SELECT * FROM t WHERE id = 19;

分组统计可以禁止排序

SELECT goods_id,count(*) FROM t GROUP BY goods_id;

默认情况下,MySQL对所有GROUP BY col1,col2...的字段进行排序。如果查询包括GROUP BY,想要避免排序结果的消耗,则可以指定ORDER BY NULL禁止排序。

SELECT goods_id,count(*) FROM t 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;  

禁止不必要的ORDER BY排序

SELECT count(1) FROM user u 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 u LEFT JOIN user_info i ON u.id = i.user_id;

批量INSERT插入

INSERT INTO t (id, name) VALUES(1,'Bea');

INSERT INTO t (id, name) VALUES(2,'Belle');

INSERT INTO t (id, name) VALUES(3,'Bernice');

INSERT INTO t (id, name) VALUES(1,'Bea'), (2,'Belle'),(3,'Bernice');

相关文章

  • 数据库学习(三)

    顾颖17021223250 转载自https://blog.csdn.net/kry12/article/deta...

  • sql笔记 P1-P38

    ##本单元目标 一、为什么要学习数据库 二、数据库的相关概念 DBMS、DB、SQL 三、数据库存储数据的特点...

  • 2020-09-10

    本单元目标 一、为什么要学习数据库 二、数据库的相关概念 DBMS、DB、SQL 三、数据库存储数据的特点 四、初...

  • MySQL基础

    本单元目标 一、为什么要学习数据库 二、数据库的相关概念DBMS、DB、SQL 三、数据库存储数据的特点 四、初始...

  • Python数据库操作,针对pymysql 和 MYSQL数据库

    此文将以MYSQL数据库做为例子,pymysql库作为驱动进行学习 安装MYSQL数据库与pymysql第三方库 ...

  • Oracle数据库学习三

    5.DML DML 语句 语句操作语言 INSERT UPDATE DELETE MERGE INSERT 方法:...

  • 20171009 周一 今日计划+反思

    一、最近三天计划 学习任务:高级数据库 - 准备Midterm 1,Due Oct 10 - 11:00am 学习...

  • 11.9c#总结

    9号 ADO.NET数据库 从三个方面学习数据库,掌握ADO.NET 的功能和组成,掌握使用 Connection...

  • HelloDjango - Python+Django+xadm

    第三篇我们来学习模型的操作,即数据库操作。 数据库操作 查询 查询所有数据urls => url(r'^query...

  • 数据库设计(一)

    惯例学习一个事物的时候先问自己三个问题 1. Android数据库是什么 Android数据库名叫sqlite,开...

网友评论

    本文标题:数据库学习(三)

    本文链接:https://www.haomeiwen.com/subject/caovuftx.html