MySQL面试题之如何优化一条有问题的SQL语句?

如何优化一条有问题的sql语句?

针对sql语句的优化。我们可以从如下几个角度去分析

  1. 回归到表的设计层面,数据类型选择是否合理
  2. 大表碎片的整理是否完善
  3. 表的统计信息,是不是准确的
  4. 审查表的执行计划,判断字段上面有没有合适的索引
  5. 针对索引的选择性,建立合适的索引(就又涉及到大表DDL的操作问题)

我们看第一点:数据类型要选取合适一些才好。

1)比如建议使用int来存储ipv4的类型,然后通过函数转换。例如:

mysql> select inet_aton(‘172.31.30.62‘);
+---------------------------+
| inet_aton(‘172.31.30.62‘) |
+---------------------------+
|                2887720510 |
+---------------------------+
1 row in set (0.00 sec)

mysql> select inet_ntoa(2887720510);
+-----------------------+
| inet_ntoa(2887720510) |
+-----------------------+
| 172.31.30.62          |
+-----------------------+
1 row in set (0.00 sec)

2)时间类型可以采用datetime属性,他比timestamp可用范围大,存储空间也从原来的8字节降到了5字节,因此可提高性能。

3)表字符集使用 utf8,必要时可申请使用 utf8mb4 字符集。

它的通用性比 gbk,latin1 都要好。utf8 字符集存储汉字占用 3 个字节,如果遇到表情存储的要求,就可以使用 utf8mb4

4) select 查询表的时候只需要获取必要的字段,避免使用 select *。

这样可以减少网络带宽消耗,还有可能利用到覆盖索引

5)所有字段定义中,默认都加上 not null 约束,避免出现 null。

在对该字段进行 select count() 统计计数时,可以让统计结果更准确,因为值为 null 的数据,不会被计算进去的。

6)SQL语句中,尽量避免出现 or 子句

这种判断的子句可以让程序自行完成,不要交给数据库判断。也要避免使用 union,尽量采用 union all,减少了去重和排序的工作。

原文地址:https://www.cnblogs.com/FengGeBlog/p/10284282.html

时间: 2024-11-09 01:59:52

MySQL面试题之如何优化一条有问题的SQL语句?的相关文章

mysql优化(三)–explain分析sql语句执行效率

mysql优化(三)–explain分析sql语句执行效率 mushu 发布于 11个月前 (06-04) 分类:Mysql 阅读(651) 评论(0) Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看SQL语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好的优化语句. Explain语法:explain select … from … [where …] 例如:explain select * from

ORACLE和SYBASE数据库中实现数据查询条数限制的SQL语句实现

一.概述 对于某些需要通过数据库与大量数据打交道的软件来说,处理性能相当的重要.为了保证软件能够将所有数据处理完而不至于崩溃,分批处理的思想应运而生.分批处理的具体做法是编写SQL语句,每次返回规定条数的数据给软件处理,待这一批数据处理完之后,再接着处理下一批. 本文通过对具体的数据库表(tb_employeeinfo)的操作过程,展示了ORACLE和SYBASE数据库中分批处理SQL语句的编写方法. 二.ORACLE数据库中的处理 首先,建立tb_employeeinfo表,其定义如下: be

【Mysql】求出离最近相差X天的项,sql语句关于日期的比对

对于一张如下的testtable表,如果要查询date离现在相差的30年的日期 则应该使用如下的sql语句: select * from testtable where timestampdiff(year,date,now())<30 这种方法,即使date这个字段是varchar类型也是可以查询成功的. timestampdiff函数中,第一个字段是单位,可以改成second,day,month等 而如下的查询方法,考虑到1985离现在相差30年,虽然简单,但是如果日期的变更,比如明年,这条

《深入浅出Mysql》——第三篇 优化篇 第十七章 常用SQL技巧和常见问题 + 第十八章 SQL优化 + 第十九章 优化数据库对象

可以利用这个函数与ORDER BY子句一起完成随机抽取某些行的功能.它的原理其实 就是ORDER BY RAND()能够把数据随机排序. 加索引 CHECK TABLE 也可以检查视图是否有错误,比如在视图定义中被引用的表已不存在,举例如 下. 原文地址:https://www.cnblogs.com/JasonPeng1/p/12234426.html

python脚本批量生成50000条插入数据的sql语句

1 f = open("xx.txt",'w') 2 for i in range(1,50001): 3 str_i = str(i) 4 realname = "lxs"+str_i 5 phone = 13678101715 + i 6 email = "lxs" + str_i +"@126.com" 7 sql = 'insert into table_a (realname,phone,email,sign,eve

SQL面试题:有A B C三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列

.请教一个面试中遇到的SQL语句的查询问题 表中有A B C三列,用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列. ------------------------------------------ select (case when a>b then a else b end ), (case when b>c then b esle c end) from table_name [sql] view plain copy drop table

几条最近常用的sql语句

1.查询表是否为空 select count(*) as total from 表 看返回值,如果>0则不为空 =0为空 2.删除表数据但保留表结构 delete from 表 where 1=1 3.select查询结果保存到一个新的表中 有2种写法: 其一:insert into 新表(要求在数据库存在) select 表项 from 已有的表 其二:select * into 新表(要求在数据库不存在) from ( select 表项 from 表 )a 这2者倾向第一种,因为第二种每次

MySQL常见注意事项及优化

MySQL常见注意事项 模糊查询 like 默认是对name字段建立了索引 注意:在使用模糊查询的时候,当% 在第一个字母的位置的时候,这个时候索引是无法被使用的.但是% 在其他的位置的时候,索引是可以被使用的. ? # select * from tableName where name like "%zhangsan"; ?可以使用到索引啊? 不可以. 分析:因为是不确定查询,在表中任何一行记录都有可能满足查询条件. ? #select * from tableName where

MySQL面试题积累

MySQL 什么是事务,MySQL是如何支持事务的? 事务就是一段sql 语句的批处理,但是这个批处理是一个原子 ,不可分割,要么都执行,要么回滚(rollback)都不执行. 事务具体四大特性,也就是经常说的ACID : 1.原子性(所有操作要么全部成功,要么全部失败回滚) 2.一致性(事务执行之前和执行之后都必须处于一致性状态.) 3.隔离性(数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离) 4.持久性(一个事务一旦被提交了,那么对数据库中的数据的改变就