原本只是想验证一下选择不同索引对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)
分享到:
相关推荐
MySQL索引优化是数据库性能提升的关键环节,本篇主要探讨了几个关于MySQL索引使用和优化的重要知识点。 首先,创建了一个名为`employees`的员工记录表,其中包含`id`(主键)、`name`、`age`、`position`和`hire_...
- **使用索引提示**:在某些复杂查询中,可以使用SQL的FORCE INDEX或USE INDEX提示强制MySQL使用特定的索引。 - **避免全表扫描**:通过优化查询语句,减少不必要的全表扫描,例如,避免在WHERE子句中使用NOT IN、!...
1. **强制索引(FORCE INDEX)**: 当你希望数据库强制使用某个特定的索引而不是默认选择时,可以使用`FORCE INDEX`。例如: ```sql SELECT * FROM TABLE1 FORCE INDEX (FIELD1) … ``` 这条SQL语句将只使用...
- **利用索引提示**:在复杂的查询中,可以使用`FORCE INDEX`、`USE INDEX`等提示强制数据库使用特定的索引,以优化查询计划。 #### 结论 理解MySQL索引的原理及其不同类型,结合具体的应用场景,合理设计和优化...
例如,使用FORCE INDEX强制使用特定索引,或使用USE INDEX推荐使用索引,以及IGNORE INDEX忽略某些索引。 事务处理也是性能瓶颈之一。合理设置事务隔离级别,根据业务需求选择合适的事务大小,可以减少锁的等待时间...
比如,使用FORCE INDEX来强制使用某个索引,使用IGNORE INDEX来忽略某个索引,或者使用SQL_NO_CACHE来强制查询不使用查询缓存。 七、服务器配置优化 除了针对查询的优化外,MySQL服务器的配置也对性能有很大影响。...
2. 使用 FORCE INDEX 语句强制使用索引。 3. 优化查询语句。 结论 ---------- 索引是 MySQL 中的一种加快数据检索速度的数据库对象。但是,如果不正确使用索引,可能会导致索引失效。因此,了解索引的使用原则和...
6. **使用`FORCE INDEX`或`USE INDEX`**:强制数据库使用特定索引可以绕过优化器的默认选择,但这需要谨慎,因为它可能不总是最优解。 7. **EXPLAIN分析**:通过`EXPLAIN`命令,我们可以分析查询计划,了解MySQL是...
而当我们使用`FORCE INDEX(a)`强制使用`a`索引时,扫描了10001行,执行时间降到了21毫秒,证明了优化器在未强制指定索引时做出了错误的选择。 优化器在判断扫描行数时,通常依赖于表的统计信息,如索引的...
- 在SQL语句中使用`FORCE INDEX`和`USE INDEX`提示强制使用特定索引。 **3. 存储引擎特性** - 熟悉不同存储引擎(如InnoDB和MyISAM)的特性,合理选择以适应不同的应用场景。 **4. 慢查询日志** - 启用慢查询...
- 使用 `FORCE INDEX`, `USE INDEX`, 或 `IGNORE INDEX` 提示来强制或排除特定索引的使用。 通过深入了解这些索引使用规则,并结合实际场景应用,可以显著提升MySQL数据库的查询性能。记住,正确地创建和管理索引...
例如,USE INDEX可以强制使用指定的索引,FORCE INDEX可以确保即使其他索引可能更合适,也会选择特定的索引。相反,IGNORE INDEX可以告诉优化器忽略某个索引。然而,这些提示的使用需要对查询和索引有深入的理解,以...
`Forceindex`可以强制MySQL使用指定的索引。 #### 9. MySQL权限相关 在MySQL中,`sql SECURITY DEFINER`和`INVOKER`用于指定存储过程、函数、触发器和视图的安全上下文。 #### 10. MySQL性能分析 `performance_...
- 使用`FORCE INDEX`语句可以指示MySQL忽略可能的优化策略,直接使用指定索引。 14. **表维护**: - 定期使用`ANALYZE TABLE`更新表的统计信息。 - 慢查询日志分析和`EXPLAIN`语句用于性能优化。 15. **系统...
FORCE INDEX可以强制使用特定索引;尽量避免让MySQL进行自动类型转换,否则可能导致索引失效。 在SQL语句优化方面,创建统计中间结果表可以减少大表的查询。尽量避免子查询,转而使用JOIN操作。例如,使用子查询...
- **SQL语句优化**:使用`force index`强制使用特定索引,查询重写,以及设置合适的`long_query_time`以记录慢查询。 3. **QPS突增应对**: - **业务高峰**:当业务量激增,DBA可能需要删除不必要的业务,或限制...
- **FORCE INDEX**: 使用`FORCE INDEX`关键字可以强制MySQL使用特定的索引来执行查询。 **2. 覆盖索引** - **覆盖索引**: 如果查询所需的所有列都在同一个索引中,那么这个索引就称为“覆盖索引”,这种情况下可以...