sql查询很慢,很多时候并不是数据量大,而是sql语法使用不正确,本文讲述了基础语法使用,避免一些不必要的坑。

explain select * from user;--查询执行时间

目录

  • Sql 优化
  • 1. 加索引
  • 2. 尽量使用数值
  • 3. 使用定长而非变长
  • 4. 使用in (小范围)、exits(大范围)exists(true)
  • 5. 使用like时右匹配
  • 6. 尽量使用btween and ,不适用><,mysql前闭后开,Oracle前闭后闭
  • 7. 查询条件不要用函数
  • 8. 过滤条件大的放最后面
  • 注意:
  • 数据库连接池配置数

Sql优化方法

Sql 优化

1. 加索引

索引失效情景:
1. 条件中有or,or后面条件列没有索引,全表扫描
2. 多列索引,不使用第一部分索引失效,遵循最左原则
3. like 以%开头
4. 查询为字符串,一定要用‘’引用
5. 全表扫描比索引快
6. 负向条件查询不使用索引,可使用in替代 <> /not in /not extsts/not like
7. 查询条件中计算不会命中索引

2. 尽量使用数值

3. 使用定长而非变长

4. 使用in (小范围)、exits(大范围)exists(true)

5. 使用like时右匹配

6. 尽量使用btween and ,不适用><,mysql前闭后开,Oracle前闭后闭

7. 查询条件不要用函数

8. 过滤条件大的放最后面

很多人说这个不影响,但在嵌套查询中,同样的查询条件如果顺序不一样,有时候查询的数据也不一样。而且sql解析时也是从后到前的顺序。所以这个优化不能忽视。

注意:

count(列) count(常量) count(distinct col1,col2) 会丢失为null的数据,使用count(*)
使用select查询不等于 <> / != 会丢失null的数据
sum(column) 会返回结果为null而非0

数据库连接池配置数

连接数 = ((核心数 * 2) + 有效磁盘数)
例:4核i7数据库服务器的连接池大小应该为((4 * 2) + 1) = 9
池大小= T n x(C m - 1)+ 1
其中T n是最大线程数,C m是单个线程持有的最大同时连接数。
例:想象三个线程(T n = 3),每个线程需要四个连接来执行某些任务(C m = 4)。确保永远不会出现死锁所需的池大小是:
泳池大小= 3 x(4 - 1)+ 1 = 10
重点:这不一定是最佳池大小,而是避免死锁所需的最小值。