高性能的MySQL(6)如何优化特定类型的查询

只要说明几种日常用到的查询可以优化的地方,只是特别的情况下可以使用,不要期望任何情况下都成立,优化是一个实践的漫长过程!

一、最大值和最小值优化

对于min()和max()查询,MySQL的优化并不是很好,比方说:

select min(actor_id) from actor where first_name = 'Jane';

因为first_name上没有索引,所以这个会扫描全表。如果MySQL能按主键扫描,那么第一个满足条件的记录就是要找的最小指了,因为主键是严格按照大小顺序排列的,一个可以尝试的方法是不用min(),使用limit:

select actor_id from actor use index(primary) where first_name = 'Jane' limit 1;

但是这条SQL的本意就不明显了。

二、在同一个表上查询和更新

MySQL不允许对同一张表同时进行查询和更新,比方说

update tab1 as outer_tab

set cnt = (

select count(*) from tab1 as inner_tab

where inner_tab.type = outer_tab.type

);

可以使用生成表的形式绕过上面的限制,子查询会在update语句打开之前就完成。

update tab1

inner join(

select type,count(*) as cnt from tab1 group by type)

as der using(type)

set tab1.cnt = der.cnt;

三、使用优化器提示(hint)

这里之说明几个重要点的

1、DELAYED

这个提示对insert 和 replace有效。MySQL会将使用该提示的语句立即返回给客户端,并将插入的数据放到缓冲区,然后在表空闲时批量将数据写入。特别适合需要写入大量数据但是客户端却不需要等待语句完成I/O的应用。

2、STRAIGHT_JOIN

这个提示可以放在select语句的select关键字之后,也可以放在任何两个关联表的名字之间。第一个用法是让查询中所有的表按照在语句中出现的顺序进行关联。第二个用法则是固定前后两个表的关联顺序。当你可以确定某个关联顺序最佳的时候,可以使用,但是版本升级的时候要重新检查该类查询。

3、SQL_SMALL_RESULT 和 SQL_BIG_RESULT

这个提示只针对select语句有效。它告诉优化器对group by 或者 distinct查询如何使用临时表及排序。

4、SQL_BUFFER_RESULT

这个提示告诉优化器将查询结果放到一个临时表,然后尽可能快的释放表锁。

5、SQL_CACHE 和 SQL_NO_CACHE

这个提示告诉MySQL结果集是否应该缓存在查询缓存中。

6、FOR UPDATE 和 LOCK IN SHARE MODE

控制行锁,只针对InnoDB引擎,这个具体以后会有介绍。

7、USE INDEX、IGNORE INDEX 和 FORCE INDEX

使用或者不使用索引来查询记录。

时间: 2024-11-05 03:28:44

高性能的MySQL(6)如何优化特定类型的查询的相关文章

高性能的MySQL(8)优化服务器配置:并发和负载

当MySQL遇到高并发时,可能会遇到不曾遇到的瓶颈. 一.InnoDB并发配置 InnoDB是为高性能设计的,在最近几年他的提升非常明显,但依然不完美. InnoDB有自己的 "线程调度器"控制线程怎么进入内核访问数据,以及他们在内核中一次可以做哪些事情.最基本的限制并发的方式是使用innodb_thread_concurrency变量,它会限制一次性可以有多少个线程进入内核,0表示不限制. 理论上,下面的公式可以给出一个这样的值 并发值 = CPU数量 * 磁盘数量 * 2 但是在实

【转载】低成本和高性能的MySQL云数据库的实现淘宝 MySQL

低成本和高性能的MySQL云数据库的实现 作者: 鸣嵩/曹伟(集团技术专家) 本文刊登于<程序员>杂志2012年12期上,转载请注明         UMP(Unified MySQL Platform)系统是淘宝核心系统数据库团队开发的低成本和高性能的MySQL云数据方案,关键模块采用Erlang语言实现.系统中包含了controller服务器.proxy服务器.agent服务器.API/Web服务器.日志分析服务器.信息统计服务器等组件,并且依赖于Mnesia.LVS.RabbitMQ.Z

mysql数据库程序优化方法

mysql数据库程序优化方法 1.选取最适用的字段属性 MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就会越快.因此,在创建表的时候,为了获得更好的性能,我们可以将表中字段的宽度设得尽可能小.例如,在定义邮政编码这个字段时,如果将其设置为CHAR(255),显然给数据库增加了不必要的空间,甚至使用VARCHAR这种类型也是多余的,因为CHAR(6)就可以很好的完成任务了.同样的,如果可以的话,我们应该使用MEDIUMINT而不是BIGIN来定义整型字

高性能的MySQL(5)索引策略-索引案例分析

理解索引最好的办法是结合实例,接下来分析一个例子. 假设要设计一个在线约会网站,用户信息表有很多列,包括国家,地区,城市,性别,眼睛颜色等等.网站必须支持上面的各种组合来搜索用户,包括根据用户的最后在线时间,评分等进行排序的限制. 需要考虑是需要索引来排序还是先检索数据再排序,因为使用索引排序会严格限制索引和查询的设计.如果MySQL使用了某个索引的范围查询,也就无法再使用另一个索引或者是该索引的后续字段进行排序了.接下来一步步讨论: 1.支持多种过滤条件 country列的选择性通常不高,但是

加速MySQL SQL语句优化的一些命令方法

引言 优化SQL,是DBA常见的工作之一.如何高效.快速地优化一条语句,是每个DBA经常要面对的一个问题.在日常的优化工作中,我发现有很多操作是在优化过程中必不可少的步骤.然而这些步骤重复性的执行,又会耗费DBA很多精力.于是萌发了自己编写小工具,提高优化效率的想法. 那选择何种语言来开发工具呢? 对于一名DBA来说,掌握一门语言配合自己的工作是非常必要的.相对于shell的简单.perl的飘逸,Python是一种严谨的高级语言.其具备上手快.语法简单.扩展丰富.跨平台等多种优点.很多人把它称为

如何用一款小工具大大加速MySQL SQL语句优化(附源码)

作者介绍 韩锋,宜信技术研发中心数据库架构师.精通多种关系型数据库,曾任职于当当网.TOM在线等公司,曾任多家公司首席DBA.数据库架构师等职,多年一线数据库架构.设计.开发经验.著有<SQL优化最佳实践>一书.   引言   优化SQL,是DBA常见的工作之一.如何高效.快速地优化一条语句,是每个DBA经常要面对的一个问题.在日常的优化工作中,我发现有很多操作是在优化过程中必不可少的步骤.然而这些步骤重复性的执行,又会耗费DBA很多精力.于是萌发了自己编写小工具,提高优化效率的想法.   那

MySQL数据库性能优化之表结构优化

很多人都将<数据库设计范式>作为数据库表结构设计"圣经",认为只要按照这个范式需求设计,就能让设计出来的表结构足够优化,既能保证性能优异同时还能满足扩展性要求.殊不知,在N年前被奉为"圣经"的数据库设计3范式早就已经不完全适用了.这里我整理了一些比较常见的数据库表结构设计方面的优化技巧,希望对大家有用. 这是 MySQL数据库性能优化专题 系列的第二篇文章:MySQL 数据库性能优化之表结构优化 系列的第一篇文章:MySQL 数据库性能优化之缓存参数优化

Mysql数据库性能优化一_Mysql

今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能.这里,我们不会讲过多的SQL语句的优化,而只是针对MySQL这一Web应用最多的数据库. mysql的性能优化无法一蹴而就,必须一步一步慢慢来,从各个方面进行优化,最终性能就会有大的提升. Mysql数据库的优化技术 对mysql优化是

Mysql数据库性能优化三(分表、增量备份、还原)_MsSql

接上篇Mysql数据库性能优化二 对表进行水平划分           如果一个表的记录数太多了,比如上千万条,而且需要经常检索,那么我们就有必要化整为零了.如果我拆成100个表,那么每个表只有10万条记录.当然这需要数据在逻辑上可以划分.一个好的划分依据,有利于程序的简单实现,也可以充分利用水平分表的优势.比如系统界面上只提供按月查询的功能,那么把表按月拆分成12个,每个查询只查询一个表就够了.如果非要按照地域来分,即使把表拆的再小,查询还是要联合所有表来查,还不如不拆了.所以一个好的拆分依据