- 浏览: 2539286 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (676)
- linux运维 (157)
- php (65)
- mysql (78)
- nginx (27)
- apche (18)
- framework (6)
- windows (9)
- IDE工具 (23)
- struts2 (7)
- java (13)
- 移动互联网 (14)
- memcache redis (23)
- shell基础/命令/语法 (37)
- shell (50)
- puppet (4)
- C (11)
- python (9)
- 产品经理 (27)
- Sphinx (4)
- svn (12)
- 设计构建 (12)
- 项目管理 (44)
- SEO (1)
- 网站架构 (26)
- 审时度势 (42)
- 网络 (14)
- 激发事业[书&视频] (81)
- 其它 (12)
- 摄影 (8)
- android (21)
最新评论
-
zhongmin2012:
原文的书在哪里
数据库水平切分的实现原理解析---分库,分表,主从,集群,负载均衡器 -
renzhengzhi:
你好,请问个问题,从master同步数据到slave的时候,s ...
数据库水平切分的实现原理解析---分库,分表,主从,集群,负载均衡器 -
ibc789:
你好,看了你的文章,我想请教个问题, 我在用 redis的时候 ...
redis 的两种持久化方式及原理 -
iijjll:
写得非常好
数据库水平切分的实现原理解析---分库,分表,主从,集群,负载均衡器 -
iijjll:
写得非常好
数据库水平切分的实现原理解析---分库,分表,主从,集群,负载均衡器
先看一下arena_match_index的表结构,大家注意表的索引结构
CREATE TABLE `arena_match_index` (
`tid` int(10) unsigned NOT NULL DEFAULT '0',
`mid` int(10) unsigned NOT NULL DEFAULT '0',
`group` int(10) unsigned NOT NULL DEFAULT '0',
`round` tinyint(3) unsigned NOT NULL DEFAULT '0',
`day` date NOT NULL DEFAULT '0000-00-00',
`begintime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
UNIQUE KEY `tm` (`tid`,`mid`),
KEY `mid` (`mid`),
KEY `begintime` (`begintime`),
KEY `dg` (`day`,`group`),
KEY `td` (`tid`,`day`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
接着看下面的sql:
SELECT round FROM arena_match_index WHERE `day` = '2010-12-31' AND `group` = 18 AND `begintime` < '2010-12-31 12:14:28' order by begintime LIMIT 1;
这条sql的查询条件显示可能使用的索引有`begintime`和`dg`,但是由于使用了order by begintime排序mysql最后选择使用`begintime`索引,explain的结果为:
mysql> explain SELECT round FROM arena_match_index WHERE `day` = '2010-12-31' AND `group` = 18 AND `begintime` < '2010-12-31 12:14:28' order by begintime LIMIT 1;
+----+-------------+-------------------+-------+---------------+-----------+---------+------+--------+-------------+
| id | select_type | table | type | possible_keys | key
| key_len | ref | rows | Extra |
+----+-------------+-------------------+-------+---------------+-----------+---------+------+--------+-------------+
| 1 | SIMPLE | arena_match_index | range | begintime,dg | begintime
| 8 | NULL | 226480 | Using where |
+----+-------------+-------------------+-------+---------------+-----------+---------+------+--------+-------------+
explain的结果显示使用`begintime`索引要扫描22w条记录,这样的查询性能是非常糟糕的,实际的执行情况也是初次执行(还未有缓存数据时)时需要30秒以上的时间。
实际上这个查询使用`dg`联合索引的性能更好,因为同一天同一个小组内也就几十场比赛,因此应该优先使用`dg`索引定位到匹配的数据集合再进行排序,那么如何告诉mysql使用指定索引呢?使用use index语句:
mysql> explain SELECT round FROM arena_match_index use index (dg)
WHERE `day` = '2010-12-31' AND `group` = 18 AND `begintime` < '2010-12-31 12:14:28' order by begintime LIMIT 1;
+----+-------------+-------------------+------+---------------+------+---------+-------------+------+-----------------------------+
| id | select_type | table | type | possible_keys | key
| key_len | ref | rows | Extra |
+----+-------------+-------------------+------+---------------+------+---------+-------------+------+-----------------------------+
| 1 | SIMPLE | arena_match_index | ref | dg | dg
| 7 | const,const | 757 | Using where; Using filesort |
+----+-------------+-------------------+------+---------------+------+---------+-------------+------+-----------------------------+
explain结果显示使用`dg`联合索引只需要扫描757条数据,性能直接提升了上百倍,实际的执行情况也是几乎立即就返回了查询结果。
在最初的查询语句中只要把order by begintime去掉,mysql就会使用`dg`索引了,再次印证了order by会影响mysql的索引选择策略!
mysql> explain SELECT round FROM arena_match_index WHERE `day` = '2010-12-31' AND `group` = 18 AND `begintime` < '2010-12-31 12:14:28' LIMIT 1;
+----+-------------+-------------------+------+---------------+------+---------+-------------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------------------+------+---------------+------+---------+-------------+------+-------------+
| 1 | SIMPLE | arena_match_index | ref | begintime,dg | dg | 7 | const,const | 717 | Using where |
+----+-------------+-------------------+------+---------------+------+---------+-------------+------+-------------+
通过上面的例子说mysql有时候也并不聪明,并非总能做出最优选择,还是需要我们开发者对它进行“调教”!
发表评论
-
mysql表修复
2015-04-07 10:16 102861.1命令myisamchk(必须停掉mysql服务,或者所操 ... -
Table_locks_immediate
2014-08-25 15:46 3064Table_locks_immediate表示立即释放表锁数 ... -
mysql分区
2014-02-21 10:38 1847mysql自5.1开始支持分区 ... -
InnoDB 引擎独立表空间 innodb_file_per_table
2013-02-25 11:14 1309http://deeplyloving.iteye.com ... -
mysql监测工具tuning-primer.sh
2013-01-21 17:57 2654【转】http://www.dbasky.net ... -
mysql主从日志的定期清理
2013-01-21 16:24 1153[转]http://wangwei007.blog.51 ... -
[转]Mysql报错:Result consisted of more than one row
2013-01-09 16:25 15865Error Code : 1172 Result consi ... -
根据bin log 分析管理员被莫名删除问题
2013-01-04 17:04 1161============== 根据bin log 分析管理 ... -
mysql中select * for update锁表的问题
2013-01-04 14:07 2508先前介绍过SELECT ... FOR UPDATE的用法 ... -
PDO报错:Cannot execute queries while other unbuffered queries are active.
2012-12-12 17:57 11925用 PDOStatement->execute() 执行 ... -
MySQL死锁导致无法查询
2012-12-11 14:51 2558客服反馈后台无法查询,原因大概知道,是因为MySQL的事务 ... -
mysql性能分析:mysql profiling 应用
2012-12-11 10:26 13441)先打开profiling ==> set pro ... -
mysql体系结构和查看当前的数据库请求
2012-12-07 15:00 2891mysql体系结构: 由 ... -
mysql_error:Error starting thread: Resource temporarily unavailable
2012-11-01 17:57 2109121031 18:53:17 InnoDB: Unable ... -
导出bin log时间段脚本datarecover.sh
2012-09-06 13:34 1242修改 _binlogdir='/data/mysql/m ... -
Mysql备份工具xtraback全量和增量测试
2012-08-17 14:58 3864【转载】http://blog.chinaunix.net/s ... -
数据库中的隔离级别和锁机制
2012-08-09 17:55 1585ANSI/ISO SQL92标准定义了 ... -
mysqldump和mysql命令
2012-08-03 13:44 1380========================= mys ... -
【汇总】mysql join
2012-07-18 11:35 1168标准SQL中CROSS JOIN交叉连接(笛卡尔积)和内连接I ... -
mysql cursor游标的使用,实例
2012-07-17 23:09 1809mysql被oracle收购后,从mysql-5.5开始, ...
相关推荐
优化SQL查询的方法还包括重构查询、创建覆盖索引、避免全表扫描、减少子查询、使用连接(JOIN)替代子查询等。在实际应用中,应结合`EXPLAIN`输出、性能分析工具以及数据库设计来确定最合适的优化策略。同时,定期...
例如,使用FORCE INDEX强制使用特定索引,或使用USE INDEX推荐使用索引,以及IGNORE INDEX忽略某些索引。 事务处理也是性能瓶颈之一。合理设置事务隔离级别,根据业务需求选择合适的事务大小,可以减少锁的等待时间...
综上所述,针对PostgreSQL的慢SQL优化涉及多个方面,包括但不限于创建有效的索引、调整查询条件、减少不必要的操作以及合理配置系统参数等。通过对这些技术的综合运用,可以显著提高数据库系统的查询性能和响应速度...
本文将详细介绍Oracle SQL中的“提示”(HINT)技术,这是Oracle SQL优化中使用的一项辅助手段,通过为查询提供额外的优化指导,帮助优化器生成更好的执行计划。 在开始讨论具体的SQL提示之前,我们先来理解什么是...
比如,`USE_INDEX`提示可以强制查询优化器使用指定的索引,而`NO_INDEX`则可防止使用某个索引。 另外,表的分区和集群也是大型Oracle数据库优化的重要策略。分区可以将大表分成更易管理的小块,从而提高查询速度。...
- 使用`INDEX`或`USE INDEX`提示强制Oracle使用特定索引。 4. **连接优化** - 优化JOIN操作可以大幅减少查询时间。 - 使用适当的JOIN顺序,通常先JOIN小表,再JOIN大表。 - 尽可能使用索引连接,避免使用巢状...
通过合理使用SQL优化提示,可以显著提高查询效率,改善数据库的整体性能。在实际应用中,应根据具体情况选择合适的优化策略,同时注意监控和分析查询执行计划,确保优化效果符合预期。希望本文介绍的内容能够帮助...
11. /*+INDEX_JOIN(TABLE INDEX_NAME)*/:该 hint 提示明确命令优化器使用索引作为访问路径。例如:SELECT /*+INDEX_JOIN(BSEMPMS SAL_HMI HIREDATE_BMI)*/ SAL,HIREDATE FROM BSEMPMS WHERE SAL;。 12. /*+INDEX_...
- `USE INDEX`:强制 MySQL 使用指定索引。 ```sql EXPLAIN SELECT * FROM table USE INDEX (ind_email) WHERE email = 'zhexiao@163.com' \G; ``` - `IGNORE INDEX`:忽略某个索引,使 MySQL 不考虑该索引。 ``...
- **CHOOSE(缺省)**:当使用`CHOOSE`时,Oracle会自动选择是使用`COST`还是`RULE`模式来优化SQL执行计划。这通常是在Oracle版本升级过程中,为了兼容旧的执行计划而使用的选项。 - **ALL_ROWS(所有的行尽快返回)...
INDEX(TABLE INDEX)(使用提示的表索引进行查询) 其它高级提示(如并行处理等等) 1.5 索引的规则: 建立索引常用的原则如下: 1. 表的主键、外键必须有索引 2. 数据量超过 1000 行的表应该有索引 3. 经常与...
优化SQL语句能够显著提升数据库性能,减少资源消耗,确保系统的高效稳定运行。 总之,掌握这些经典SQL语句和优化技巧,能够帮助数据库管理员和开发者更有效地管理和操作数据库,提高数据库应用的效率和用户体验。在...
在实际应用中,可以根据具体的查询需求和性能目标灵活运用这些`HINT`来优化SQL查询,从而显著提高系统的响应速度和整体性能。需要注意的是,在使用`HINT`时应谨慎评估其效果,避免因不当使用而引入性能问题。
这些技巧涵盖了从查询提示、索引使用到查询重写等多个方面,是数据库管理员和开发人员进行SQL语句优化时的重要工具。通过合理运用这些技巧,可以显著提升数据库查询的性能,降低系统负载,提高应用程序的整体响应...
- **谨慎使用**:仅在必要时使用SQL提示,避免无端干预优化器决策。 - **定期审查**:随着数据量变化或硬件升级,原有的SQL提示可能不再适用,应定期检查并更新。 - **文档记录**:记录每一条SQL提示的原因和目的,...
SQL语句优化是通过调整查询语句的结构或利用数据库特性来提高查询效率的过程。本文将详细介绍几种常用的SQL提示(hint)以及它们在实际场景中的应用。 #### 二、SQL提示(Hint)详解 **1. /*+ALL_ROWS*/** - **...
* 查询优化:优化查询语句以提高查询效率。 * 索引优化:优化索引以提高查询效率。 * 数据库存储优化:优化数据库存储以提高查询效率。 以上是 SQL 语法的基础知识点,了解这些基础概念可以帮助您更好地使用 SQL ...
SQL语句是结构化查询语言(Structured Query Language)的简称,是用于管理和处理关系数据库的标准语言。本篇文章将深入探讨SQL语句的基本语法,包括数据定义、数据操作、实用工具、事务处理和锁定、数据库管理、...