领先的免费Web技术教程,涵盖HTML到ASP.NET

网站首页 > 知识剖析 正文

数据库(数据库有哪些)

nixiaole 2025-05-11 00:10:37 知识剖析 3 ℃

排查

explain中只关注type,key,rows,key 索引 rows 行数 type 接类型

EXPLAIN SELECT * FROM your_table WHERE condition;

慢查询->explain->index 慢查询日志

开启慢查询日志,查看慢查询的 SQLshow variables like '%slow_query_log_file%';

使用 show processlist 命令查看当前所有连接信息

通过 SHOW INDEX 验证索引 ,若 key 列为 NULL,表示未使用索引

index 是否缺失

sql 消耗资源并不多,但是突然之间有大量的 session 连进来导致 cpu 飙升,比如说限制连接数等

kill 掉这些占用线程,加索引、改 sql、改内存参数之后,再重新跑这些 SQL。

SQL 性能优化 explain 中的 type:至少要达到 range 范围级别,要求是 ref 普通的索引级别,

当 type=index 时,索引物理文件全扫,速度非常慢。

考虑接口返回值 前端送参数为空 或者格式不正确 类型不正确等送参数容错机制

sql优化

分页

防止sql注入--传参大部分使用"#{}",在数据库底层使用的是:被解析为"?

inner join 、left join、right join,优先使用inner join

如果是表关联查询,能用inner join等值连接就不用left join和right join,如果必须使用的话,尽量要以小表为驱动。inner join会对两个表进行优化提高性能,优先把小表放外边,大表放里边,而left join和right join不会重新调整顺序

尽量避免使用 select *,返回无用的字段会降低查询效率

控制字段长度

添加必要的索引

先过滤 where,后分组grounp by

union、in、or 都能够命中索引,建议使用 in or查询优化耗费的cpu比in多不是所有的or都命中索引

WHERE 子句用于在分组之前过滤行(在GROUP BY 子句之前),

而 HAVING 子句用于在分组之后过滤行。

用union all代替union ,union关键字可以获取排重后的数据,会把结果集中 重复的记录删掉

union all关键字,可以获取所有数据,包含重复的数据,且效率高于 UNION

批量操作

性能优化

一主多从集群部署

服务器优化(增加 CPU、内存、网络、更换高性能磁盘)

路由策略

负载均衡策略

服务降级策略

多线程

批量操作数据入库

异步处理

reids作缓存

全局异常处理


索引的类型--索引就是单独的 值进行排序的

常见的索引类型 --B+树索引 Hash索引

根据索引功能分类 普通索引 唯一索引 主键索引 联合索引

按存储结构分类 聚集索引 非聚集索引

索引失效的情况和解决方法

避免为"大字段"建立索引 选择区分度大的列作为索引 选择ORDER BY 和 GROUP BY 后面的字段建立索引

1. 尽量避免在字段开头模糊查询, 会全表扫描

SELECT * FROM user WHERE name LIKE '%用%'

解决方法在字段后面使用模糊查询 SELECT * FROM user WHERE name LIKE '用%'

2尽量避免使用in 和not in,会导致引擎走全表扫描 解决方法可以用between代替

3尽量避免使用 or,会全表扫描 解决方法 可以用union(且)代替or

5 尽量避免进行null值的判断,会全表扫描

解决方法可可以给字段添加默认值0,对0值进行判断

select * from user WHERE age = 0

5.尽量避免在where条件中等号的左侧进行表达式、函数操作

可以将表达式、函数操作移动到等号右侧 ( 不建议这样写会造成运行效率降低 )

-- 全表扫描

SELECT * FROM user WHERE age/10 = 9

-- 走索引

SELECT * FROM user WHERE age = 10*9

6. where条件仅包含复合索引非前置列

如下:复合(联合)索引包含a1,b2,c3三列,但SQL语句没有包含索引前置列"a1",按照MySQL联合索引的最左匹配原则,不会走联合索引


7. 隐式类型转换造成不使用索引 字符串与数字比较不走索引:

如下SQL语句由于索引对列类型为varchar,但给定的值为数值,涉及隐式类型转换,造成不能正确走索引。

select name from table where name = 123;

8正则表达式不使用索引。

9不要在列上进行运算 select * from users where YEAR(adddate)<2007;

改成 select * from users where adddate<‘2007-01-01’;

10NOT IN和<>会全表扫描 NOT IN可以NOT EXISTS代替,id<>3则可使用id>3 or id<3来代替

Tags:

最近发表
标签列表