`
jef
  • 浏览: 118555 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Mysql的强制索引(Force Index)都为我们做了哪些优化?

阅读更多

原本只是想验证一下选择不同索引对innodb count(*)查询速度的影响。
各位顺道可参考下这篇文章 [InnoDB系列] -- innodb表如何更快得到count(*)结果。

测试过程中没想到同样的一条sql语句仅仅是增加了force index后查询速度几乎快了一倍。
select count(*) from http_log_3 force index(time) where time >= 000000    //1 row in set (11 min 19.35 sec)
select count(*) from http_log_3 where time >= 000000    //1 row in set (20 min 5.86 sec)


但实际上通过explain分析可知其实这两条sql语句使用的都是time索引,完全一样!
在这个特例当中使用force index(time)后影响的并不是索引key的选择(优化器默认也使用time索引),而是type及rows.


很想知道这是为什么,rows是如何被估算出来的,可有公式?

测试环境:
数据库 mysql 5.1.34,innodb引擎,使用innodb_file_per_table选项。
使用表分区方式创建数据表(按日分区共十个),表中一共有5000万数据,即每个分区各500万。

测试输出:

--------------
explain partitions select count(*) from http_log_3 force index(time) where time >= 000000
--------------

+----+-------------+------------+-----------------------------------+-------+---------------+------+---------+------+----------+--------------------------+
| id | select_type | table      | partitions                        | type  | possible_keys | key  | key_len | ref  | rows     | Extra                    |
+----+-------------+------------+-----------------------------------+-------+---------------+------+---------+------+----------+--------------------------+
|  1 | SIMPLE      | http_log_3 | p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10 | range | time          | time | 3       | NULL | 25000141 | Using where; Using index |
+----+-------------+------------+-----------------------------------+-------+---------------+------+---------+------+----------+--------------------------+
1 row in set (0.01 sec)

--------------
explain partitions select count(*) from http_log_3 where time >= 000000
--------------

+----+-------------+------------+-----------------------------------+-------+--------------------------+------+---------+------+----------+--------------------------+
| id | select_type | table      | partitions                        | type  | possible_keys            | key  | key_len | ref  | rows     | Extra                    |
+----+-------------+------------+-----------------------------------+-------+--------------------------+------+---------+------+----------+--------------------------+
|  1 | SIMPLE      | http_log_3 | p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10 | index | time_ip,time_domain,time | time | 3       | NULL | 50000291 | Using where; Using index |
+----+-------------+------------+-----------------------------------+-------+--------------------------+------+---------+------+----------+--------------------------+
1 row in set (0.01 sec)

--------------
explain partitions select count(*) from http_log_3
--------------

+----+-------------+------------+-----------------------------------+-------+---------------+------+---------+------+----------+-------------+
| id | select_type | table      | partitions                        | type  | possible_keys | key  | key_len | ref  | rows     | Extra       |
+----+-------------+------------+-----------------------------------+-------+---------------+------+---------+------+----------+-------------+
|  1 | SIMPLE      | http_log_3 | p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10 | index | NULL          | time | 3       | NULL | 50000291 | Using index |
+----+-------------+------------+-----------------------------------+-------+---------------+------+---------+------+----------+-------------+
1 row in set (0.00 sec)

--------------
select count(*) from http_log_3 force index(time) where time >= 000000
--------------

+----------+
| count(*) |
+----------+
| 50000000 |
+----------+
1 row in set (11 min 19.35 sec)

--------------
select count(*) from http_log_3 where time >= 000000
--------------

+----------+
| count(*) |
+----------+
| 50000000 |
+----------+
1 row in set (20 min 5.86 sec)

--------------
select count(*) from http_log_3
--------------

+----------+
| count(*) |
+----------+
| 50000000 |
+----------+
1 row in set (20 min 6.32 sec)

 

 

 

分享到:
评论
2 楼 jef 2009-05-15  
猫尾摆摆 写道
select count(*) from http_log_3
--------------

+----------+
| count(*) |
+----------+
| 50000000 |
+----------+
1 row in set (20 min 6.32 sec)

这条语句也要20分钟来执行???是不是我看错了还是????

没看错,确实是这样。当然如果使用的是myisam引擎的话,类似这种count(*)简单查询操作执行起来会非常快。
1 楼 猫尾摆摆 2009-05-15  
select count(*) from http_log_3
--------------

+----------+
| count(*) |
+----------+
| 50000000 |
+----------+
1 row in set (20 min 6.32 sec)

这条语句也要20分钟来执行???是不是我看错了还是????

相关推荐

    04-VIP-Mysql索引优化实战一.pdf

    MySQL索引优化是数据库性能提升的关键环节,本篇主要探讨了几个关于MySQL索引使用和优化的重要知识点。 首先,创建了一个名为`employees`的员工记录表,其中包含`id`(主键)、`name`、`age`、`position`和`hire_...

    mysql查询优化之索引优化

    - **使用索引提示**:在某些复杂查询中,可以使用SQL的FORCE INDEX或USE INDEX提示强制MySQL使用特定的索引。 - **避免全表扫描**:通过优化查询语句,减少不必要的全表扫描,例如,避免在WHERE子句中使用NOT IN、!...

    MYSQL中常用的强制性操作(例如强制索引)

    1. **强制索引(FORCE INDEX)**: 当你希望数据库强制使用某个特定的索引而不是默认选择时,可以使用`FORCE INDEX`。例如: ```sql SELECT * FROM TABLE1 FORCE INDEX (FIELD1) … ``` 这条SQL语句将只使用...

    mysql索引分析和优化

    - **利用索引提示**:在复杂的查询中,可以使用`FORCE INDEX`、`USE INDEX`等提示强制数据库使用特定的索引,以优化查询计划。 #### 结论 理解MySQL索引的原理及其不同类型,结合具体的应用场景,合理设计和优化...

    mysql的sql优化

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

    MySql优化.pdf

    比如,使用FORCE INDEX来强制使用某个索引,使用IGNORE INDEX来忽略某个索引,或者使用SQL_NO_CACHE来强制查询不使用查询缓存。 七、服务器配置优化 除了针对查询的优化外,MySQL服务器的配置也对性能有很大影响。...

    mysql 索引失效详解

    2. 使用 FORCE INDEX 语句强制使用索引。 3. 优化查询语句。 结论 ---------- 索引是 MySQL 中的一种加快数据检索速度的数据库对象。但是,如果不正确使用索引,可能会导致索引失效。因此,了解索引的使用原则和...

    mysql中or是否走索引详解

    6. **使用`FORCE INDEX`或`USE INDEX`**:强制数据库使用特定索引可以绕过优化器的默认选择,但这需要谨慎,因为它可能不总是最优解。 7. **EXPLAIN分析**:通过`EXPLAIN`命令,我们可以分析查询计划,了解MySQL是...

    10.MySQL为什么有时候会选错索引?1

    而当我们使用`FORCE INDEX(a)`强制使用`a`索引时,扫描了10001行,执行时间降到了21毫秒,证明了优化器在未强制指定索引时做出了错误的选择。 优化器在判断扫描行数时,通常依赖于表的统计信息,如索引的...

    MySQL进阶学习需要掌握的具体内容解析,MySQL数据库如何使用和优化索引.docx

    - 在SQL语句中使用`FORCE INDEX`和`USE INDEX`提示强制使用特定索引。 **3. 存储引擎特性** - 熟悉不同存储引擎(如InnoDB和MyISAM)的特性,合理选择以适应不同的应用场景。 **4. 慢查询日志** - 启用慢查询...

    MySQL 进阶-索引使用规则

    - 使用 `FORCE INDEX`, `USE INDEX`, 或 `IGNORE INDEX` 提示来强制或排除特定索引的使用。 通过深入了解这些索引使用规则,并结合实际场景应用,可以显著提升MySQL数据库的查询性能。记住,正确地创建和管理索引...

    运用解析器优化MySQL数据库查询性能.pdf

    例如,USE INDEX可以强制使用指定的索引,FORCE INDEX可以确保即使其他索引可能更合适,也会选择特定的索引。相反,IGNORE INDEX可以告诉优化器忽略某个索引。然而,这些提示的使用需要对查询和索引有深入的理解,以...

    MySQL OCP超详细学习笔记

    `Forceindex`可以强制MySQL使用指定的索引。 #### 9. MySQL权限相关 在MySQL中,`sql SECURITY DEFINER`和`INVOKER`用于指定存储过程、函数、触发器和视图的安全上下文。 #### 10. MySQL性能分析 `performance_...

    Mysql建表与索引使用规范详解

    - 使用`FORCE INDEX`语句可以指示MySQL忽略可能的优化策略,直接使用指定索引。 14. **表维护**: - 定期使用`ANALYZE TABLE`更新表的统计信息。 - 慢查询日志分析和`EXPLAIN`语句用于性能优化。 15. **系统...

    MySQL数据库优化技术之索引使用技巧总结

    FORCE INDEX可以强制使用特定索引;尽量避免让MySQL进行自动类型转换,否则可能导致索引失效。 在SQL语句优化方面,创建统计中间结果表可以减少大表的查询。尽量避免子查询,转而使用JOIN操作。例如,使用子查询...

    22MySQL有哪些“饮鸩止渴”提高性能的方法?.pptx

    - **SQL语句优化**:使用`force index`强制使用特定索引,查询重写,以及设置合适的`long_query_time`以记录慢查询。 3. **QPS突增应对**: - **业务高峰**:当业务量激增,DBA可能需要删除不必要的业务,或限制...

    MYSQL基础知识,一些常用问题

    - **FORCE INDEX**: 使用`FORCE INDEX`关键字可以强制MySQL使用特定的索引来执行查询。 **2. 覆盖索引** - **覆盖索引**: 如果查询所需的所有列都在同一个索引中,那么这个索引就称为“覆盖索引”,这种情况下可以...

Global site tag (gtag.js) - Google Analytics