`
zhengdl126
  • 浏览: 2539286 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类

使用use index优化sql查询

 
阅读更多

先看一下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有时候也并不聪明,并非总能做出最优选择,还是需要我们开发者对它进行“调教”!

分享到:
评论

相关推荐

    使用use index优化sql查询的详细介绍

    优化SQL查询的方法还包括重构查询、创建覆盖索引、避免全表扫描、减少子查询、使用连接(JOIN)替代子查询等。在实际应用中,应结合`EXPLAIN`输出、性能分析工具以及数据库设计来确定最合适的优化策略。同时,定期...

    mysql的sql优化

    例如,使用FORCE INDEX强制使用特定索引,或使用USE INDEX推荐使用索引,以及IGNORE INDEX忽略某些索引。 事务处理也是性能瓶颈之一。合理设置事务隔离级别,根据业务需求选择合适的事务大小,可以减少锁的等待时间...

    慢SQL优化In PostgreSQL

    综上所述,针对PostgreSQL的慢SQL优化涉及多个方面,包括但不限于创建有效的索引、调整查询条件、减少不必要的操作以及合理配置系统参数等。通过对这些技术的综合运用,可以显著提高数据库系统的查询性能和响应速度...

    Oracle SQL 优化与调优技术详解-附录:SQL提示

    本文将详细介绍Oracle SQL中的“提示”(HINT)技术,这是Oracle SQL优化中使用的一项辅助手段,通过为查询提供额外的优化指导,帮助优化器生成更好的执行计划。 在开始讨论具体的SQL提示之前,我们先来理解什么是...

    基于Oracle的SQL优化 崔华

    比如,`USE_INDEX`提示可以强制查询优化器使用指定的索引,而`NO_INDEX`则可防止使用某个索引。 另外,表的分区和集群也是大型Oracle数据库优化的重要策略。分区可以将大表分成更易管理的小块,从而提高查询速度。...

    基于Oracle的SQL优化典型案例分

    - 使用`INDEX`或`USE INDEX`提示强制Oracle使用特定索引。 4. **连接优化** - 优化JOIN操作可以大幅减少查询时间。 - 使用适当的JOIN顺序,通常先JOIN小表,再JOIN大表。 - 尽可能使用索引连接,避免使用巢状...

    SQL语句优化过程策略,帮助您优化Oracle查询语句

    通过合理使用SQL优化提示,可以显著提高查询效率,改善数据库的整体性能。在实际应用中,应根据具体情况选择合适的优化策略,同时注意监控和分析查询执行计划,确保优化效果符合预期。希望本文介绍的内容能够帮助...

    SQL语句优化方法30例

    11. /*+INDEX_JOIN(TABLE INDEX_NAME)*/:该 hint 提示明确命令优化器使用索引作为访问路径。例如:SELECT /*+INDEX_JOIN(BSEMPMS SAL_HMI HIREDATE_BMI)*/ SAL,HIREDATE FROM BSEMPMS WHERE SAL;。 12. /*+INDEX_...

    18 SQL优化--其他SQL的优化.doc

    - `USE INDEX`:强制 MySQL 使用指定索引。 ```sql EXPLAIN SELECT * FROM table USE INDEX (ind_email) WHERE email = 'zhexiao@163.com' \G; ``` - `IGNORE INDEX`:忽略某个索引,使 MySQL 不考虑该索引。 ``...

    SQL优化 '%5400%' LIKE操作符

    - **CHOOSE(缺省)**:当使用`CHOOSE`时,Oracle会自动选择是使用`COST`还是`RULE`模式来优化SQL执行计划。这通常是在Oracle版本升级过程中,为了兼容旧的执行计划而使用的选项。 - **ALL_ROWS(所有的行尽快返回)...

    SQL性能优化

     INDEX(TABLE INDEX)(使用提示的表索引进行查询)  其它高级提示(如并行处理等等) 1.5 索引的规则: 建立索引常用的原则如下: 1. 表的主键、外键必须有索引 2. 数据量超过 1000 行的表应该有索引 3. 经常与...

    数据库经典语句,优化SQL语句大全

    优化SQL语句能够显著提升数据库性能,减少资源消耗,确保系统的高效稳定运行。 总之,掌握这些经典SQL语句和优化技巧,能够帮助数据库管理员和开发者更有效地管理和操作数据库,提高数据库应用的效率和用户体验。在...

    SQL优化过程中常见Oracle中&quot;HINT&quot;的30个用法

    在实际应用中,可以根据具体的查询需求和性能目标灵活运用这些`HINT`来优化SQL查询,从而显著提高系统的响应速度和整体性能。需要注意的是,在使用`HINT`时应谨慎评估其效果,避免因不当使用而引入性能问题。

    sql语句优化方法30例.sql.txt

    这些技巧涵盖了从查询提示、索引使用到查询重写等多个方面,是数据库管理员和开发人员进行SQL语句优化时的重要工具。通过合理运用这些技巧,可以显著提升数据库查询的性能,降低系统负载,提高应用程序的整体响应...

    Oracle SQL 优化与调优技术详解-附录:SQL提示.pdf

    - **谨慎使用**:仅在必要时使用SQL提示,避免无端干预优化器决策。 - **定期审查**:随着数据量变化或硬件升级,原有的SQL提示可能不再适用,应定期检查并更新。 - **文档记录**:记录每一条SQL提示的原因和目的,...

    SQL语句优化.txt

    SQL语句优化是通过调整查询语句的结构或利用数据库特性来提高查询效率的过程。本文将详细介绍几种常用的SQL提示(hint)以及它们在实际场景中的应用。 #### 二、SQL提示(Hint)详解 **1. /*+ALL_ROWS*/** - **...

    SQL 语法SQL 语法.doc

    * 查询优化:优化查询语句以提高查询效率。 * 索引优化:优化索引以提高查询效率。 * 数据库存储优化:优化数据库存储以提高查询效率。 以上是 SQL 语法的基础知识点,了解这些基础概念可以帮助您更好地使用 SQL ...

    SQL语句语法

    SQL语句是结构化查询语言(Structured Query Language)的简称,是用于管理和处理关系数据库的标准语言。本篇文章将深入探讨SQL语句的基本语法,包括数据定义、数据操作、实用工具、事务处理和锁定、数据库管理、...

Global site tag (gtag.js) - Google Analytics