加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

[MySQL]select和where子句优化

发布时间:2020-12-11 23:59:11 所属栏目:MySql教程 来源:网络整理
导读:数据库优化: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子句不匹配的行

以下表被用作常量表:

t primary_key t1.primary_key t2.primary_keyt1.id;

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

() <span style="color: #0000ff">SELECT <span style="color: #ff00ff">MIN(key_part1),<span style="color: #ff00ff">MAX(key_part1) <span style="color: #0000ff">FROM<span style="color: #000000"> tbl_name;

<span style="color: #0000ff">SELECT <span style="color: #ff00ff">MAX(key_part2) <span style="color: #0000ff">FROM<span style="color: #000000"> tbl_name
<span style="color: #0000ff">WHERE key_part1<span style="color: #808080">=<span style="color: #000000">constant;

<span style="color: #0000ff">SELECT ... <span style="color: #0000ff">FROM<span style="color: #000000"> tbl_name
<span style="color: #0000ff">ORDER <span style="color: #0000ff">BY key_part1,key_part2,... LIMIT <span style="color: #800000; font-weight: bold">10<span style="color: #000000">;

<span style="color: #0000ff">SELECT ... <span style="color: #0000ff">FROM<span style="color: #000000"> tbl_name
<span style="color: #0000ff">ORDER <span style="color: #0000ff">BY key_part1 <span style="color: #0000ff">DESC,key_part2 <span style="color: #0000ff">DESC,... LIMIT <span style="color: #800000; font-weight: bold">10;

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

key_part1,key_part2 tbl_name key_part1<span style="color: #0000ff">SELECT <span style="color: #ff00ff">COUNT(<span style="color: #808080">*) <span style="color: #0000ff">FROM<span style="color: #000000"> tbl_name
<span style="color: #0000ff">WHERE
key_part1<span style="color: #808080">=
val1 <span style="color: #808080">AND
key_part2<span style="color: #808080">=
<span style="color: #000000">val2;

<span style="color: #0000ff">SELECT key_part2 <span style="color: #0000ff">FROM tbl_name <span style="color: #0000ff">GROUP <span style="color: #0000ff">BY key_part1;

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

... <span style="color: #0000ff">SELECT ... <span style="color: #0000ff">FROM<span style="color: #000000"> tbl_name
<span style="color: #0000ff">ORDER
<span style="color: #0000ff">BY
key_part1 <span style="color: #0000ff">DESC
,... ;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读