欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

[MySQL]select和where子句优化

程序员文章站 2022-04-14 17:09:36
数据库优化:1.可以在单个SQL语句,整个应用程序,单个数据库服务器或多个联网数据库服务器的级别进行优化2.数据库性能取决于数据库级别的几个因素,例如表,查询和配置设置3.在数据库级别进行优化,在硬件级别进行优化,平衡可移植性和性能4.合适的结构,合适的数据类型;执行频繁更新的应用程序大量表(少列) ......

数据库优化:
1.可以在单个sql语句,整个应用程序,单个数据库服务器或多个联网数据库服务器的级别进行优化
2.数据库性能取决于数据库级别的几个因素,例如表,查询和配置设置
3.在数据库级别进行优化,在硬件级别进行优化,平衡可移植性和性能
4.合适的结构,合适的数据类型;执行频繁更新的应用程序大量表(少列);分析大量数据的应用程序少量表(多列);选择合适的存储引擎和索引;
5.压缩适用于innodb表的各种工作负载,以及只读myisam表
6.选择合适的锁定策略;innodb存储引擎可以处理大多数锁定问题
7.配置的主要内存区域是innodb缓冲池和myisam密钥缓存。
8.优化select语句,这方面技巧同样适用于其他带where的delete语句等,在where子句的列上设置索引;索引对于引用多个列如join和外键尤其重要

 

select where子句优化:
1.调整查询的结构,例如函数调用,为结果集中的每一行只调用一次,为表中的每一行只调用一次
2.减少查询中的全表扫描数
3.定期使用analyze table语句使表统计信息保持最新
4.了解特定于每个表的存储引擎的调优技术,索引技术和配置参数
5.优化innodb表的单查询事务
6.通过阅读explain计划并调整索引,where子句,连接子句等来调查特定查询的内部详细信息
7.调整mysql用于缓存的内存区域的大小和属性。通过有效使用innodb缓冲池,myisam密钥缓存和mysql查询缓存
8.where条件,去掉不必要的括号,恒定折叠,恒定条件去除,减少不必要的逻辑
9.被索引使用的常量表达式只计算一次
10.count(*)直接从表信息中查询;当只有一张表时,not null表达式也是这样
11.如果不使用group by或聚合函数(count(),min()等),having将与where合并
12.常量表,只有一行或空表;where子句作用在primary key或者unique索引上
13.如果order by和group by子句中的所有列都来自同一个表,则在连接时首选该表
14.如果order by子句和group by子句不一样,或来自不同的表,则会创建临时表
15.如果使用sql_small_result修饰符,mysql将使用内存中的临时表
16.mysql甚至无需咨询数据文件即可只从索引中读取行
17.在输出每一行之前,将跳过与having子句不匹配的行

以下表被用作常量表:

select * from t where primary_key=1;
select * from t1,t2
  where t1.primary_key=1 and t2.primary_key=t1.id;

以下查询运行速度非常快:

select count(*) from tbl_name;

select min(key_part1),max(key_part1) from tbl_name;

select max(key_part2) from tbl_name
  where key_part1=constant;

select ... from tbl_name
  order by key_part1,key_part2,... limit 10;

select ... from tbl_name
  order by key_part1 desc, key_part2 desc, ... limit 10;

假设索引列是数值型,以下查询仅用到了索引树:

select key_part1,key_part2 from tbl_name where key_part1=val;

select count(*) from tbl_name
  where key_part1=val1 and key_part2=val2;

select key_part2 from tbl_name group by key_part1;

以下查询使用索引按排序顺序取回数据,不需要单独排序

select ... from tbl_name
  order by key_part1,key_part2,... ;

select ... from tbl_name
  order by key_part1 desc, key_part2 desc, ... ;