【问题标题】:Mysql not using any indexMysql 不使用任何索引
【发布时间】:2012-12-31 22:25:59
【问题描述】:

我有一个相当简单的查询,由于某种原因没有使用任何索引:

CREATE TABLE `events_self` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`date` int(10) unsigned NOT NULL,
`username` varchar(16) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL,
`event` enum('status_update','follow_hashtag','make_hashtag','avatar','placeholder_3') CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL,
`obj_id` varchar(140) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL,
`inline` varchar(255) CHARACTER SET latin1 COLLATE latin1_general_ci NOT NULL,
PRIMARY KEY (`id`,`date`),
KEY `obj_id` (`obj_id`),
KEY `user_date` (`username`,`date`),
KEY `event` (`event`),
KEY `x` (`event`,`inline`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;


INSERT INTO `events_self` (`id`, `date`, `username`, `event`, `obj_id`, `inline`) VALUES (1, 1358359266, 'aaa', 'make_hashtag', '1', 'scene');

SELECT inline FROM events_self  WHERE obj_id = 1;

EXPLAIN SELECT inline FROM events_self  WHERE obj_id = 1;


+----+-------------+-------------+------+---------------+------+---------+------+---------+-------------+
| id | select_type | table       | type | possible_keys | key  | key_len | ref  | rows    | Extra       |
+----+-------------+-------------+------+---------------+------+---------+------+---------+-------------+
|  1 | SIMPLE      | events_self | ALL  | obj_id        | NULL | NULL    | NULL | 1610702 | Using where |
+----+-------------+-------------+------+---------------+------+---------+------+---------+-------------+
1 row in set (0.00 sec)

服务器版本:5.3.2-MariaDB-beta-mariadb102~lenny-log (MariaDB - http://mariadb.com/)

我应该让表/查询保持原样还是最好强制使用索引?

【问题讨论】:

  • 这里的问题是什么?我在您的内容中没有看到任何问号
  • 这可能是因为对于您的查询,MySQL 认为不使用索引是最好的处理方式。尝试并强制它使用您认为应该使用的索引并比较结果。
  • 由于您的表中有一个条目,mysql 估计执行表扫描所需的资源比索引扫描要少。不要忘记查询执行计划考虑了表中的行数。
  • @MateiMihai 哎呀,我忘了包括我的问题。我现在在问题上添加了它。
  • @ioan 在它计数的生产服务器上:~1,426,959 行,每天添加数千行

标签: mysql innodb mariadb


【解决方案1】:

试试这个

EXPLAIN SELECT inline FROM events_self  WHERE obj_id = "1";

由于你发送的是整数,MySql 不会将索引视为类型不同。

【讨论】:

  • 哎呀,我从来没有见过这样的事情。显然它现在可以正常工作。不幸的是 obj_id 必须是 varchar(140)。你知道我在哪里可以阅读有关 Mysql 索引类型问题的信息吗?谢谢
  • 您可以修改查询以发送字符串而不是 int。
  • 确实:WHERE obj_id = 985591 LIMIT 1 => 1 行在集合中(0.66 秒)WHERE obj_id = "985591" LIMIT 1 => 1 行在集合中(0.00 秒)
猜你喜欢
  • 1970-01-01
  • 2018-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-27
  • 2013-04-07
  • 2013-07-10
相关资源
最近更新 更多