Mysql 随心笔记

创建索引后但不生效:

1. %放在索引字段前面  select * from user like '%123'

2. where 子句里对有索引列使用了函数  select * from user where reverse(name)='123'

3.类型不一致,name 是字符串  select * from user where name =123

4.!=(主键除外) select * from user where name !=123

5.非主键字符串用>

6.组合索引,但是其他有字段不是索引字段

7.or 条件有未索引字段

8.where子句中,对索引字段使用数学运算

9.如果Mysql估计使用全表扫描比索引快,也不使用索引

 

SQL优化

1.单表优化

a.索引不能跨列使用(最佳的做前缀),保持索引的定义和使用的顺序一致性  

b.索引要逐步优化

c.将含 in 的范围查询放到where 最后 ,in有可能会使索引失效

Using where :需要回原表查询

Using index :不需要回原表

 2.多表优化

 a.小表驱动大表

 两表left join 连接 on 后面 为 小表.Id=大表.Id

给小表Id添加索引

 

3.避免索引失效原则

a. 复合索引,不要跨列或无序使用(最佳左前缀)

b. 复合索引,尽量使用全索引匹配

c. 不要在索引字段进行任何操作(计算、函数、类型转换),否则索引失效

d. 复合索引不能使用不等于(!= <>)或is null  (is not null),否则自身以及右侧所有索引全部失效

e. like 尽量以“常量”开头,不要以“%”开头,否则所以失效  

select * from user where username like '%aa%'

优化 select username from user where username like '%aa%'   索引覆盖

f. 尽量不要使用类型转换(显式或隐式),否则索引失效

g.尽量不要使用or,否则索引失效

4.常见优化方法

a. 如果主查询数据量大,则使用in    如果子查询数据量大,则使用exist

b. order by 优化

选择使用单路、双路;调整buffer的容量

避免使用select *  ,写实际的字段名称

保证排序的一直性(都是升序或者降序)

5.SQL排查 - 慢查询日志 :Mysql 提供的一种日志记录,用于记录MySQL中响应时间超过阈值的sql语句

默认是关闭状态

 

 

 

 

 

Mysql 常见函数

1.having的用法

having字句可以让我们筛选成组后的各种数据,where字句在聚合前先筛选记录,也就是说作用在group by和having字句前。而 having子句在聚合后对组记录进行筛选。我的理解就是真实表中没有此数据,这些数据是通过一些函数生存。

案例:显示每个地区的总人口数和总面积.仅显示那些面积超过1000000的地区。

SELECT region, SUM(population), SUM(area)
FROM bbc
GROUP BY region
HAVING SUM(area)>1000000

在这里,我们不能用where来筛选超过1000000的地区,因为表中不存在这样一条记录。
相反,having子句可以让我们筛选成组后的各组数据

 

posted @ 2020-10-30 14:55  Ivin-yang  阅读(107)  评论(0编辑  收藏  举报