sql - MySQL:哪些索引用于简单范围选择?

标签 sql mysql select indexing range

我有一个大约有 3000 万行的表(并且还在不断增长!),目前我在简单的范围选择方面遇到了一些问题。

查询看起来像这样:

SELECT SUM( CEIL( dlvSize / 100 ) ) as numItems
FROM log
WHERE timeLogged BETWEEN 1000000 AND 2000000
AND user = 'example'</pre>

需要几分钟才能完成,我认为解决方案是我正在使用的索引。解释结果如下:

+----+-------------+-------+-------+---------------------------------+---------+---------+------+----------+-------------+
| id | select_type | table | type  | possible_keys                   | key     | key_len | ref  | rows     | Extra       |
+----+-------------+-------+-------+---------------------------------+---------+---------+------+----------+-------------+
|  1 | SIMPLE      | log   | range | PRIMARY,timeLogged              | PRIMARY | 4       | NULL | 11839754 | Using where | 
+----+-------------+-------+-------+---------------------------------+---------+---------+------+----------+-------------+

我的表结构是这样的(减少以使其更好地适应问题):

CREATE TABLE IF NOT EXISTS `log` (
  `origDomain` varchar(64) NOT NULL default '0',
  `timeLogged` int(11) NOT NULL default '0',
  `orig` varchar(128) NOT NULL default '',
  `rcpt` varchar(128) NOT NULL default '',
  `dlvSize` varchar(255) default NULL,
  `user` varchar(255) default NULL,
  PRIMARY KEY  (`timeLogged`,`orig`,`rcpt`),
  KEY `timeLogged` (`timeLogged`),
  KEY `orig` (`orig`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

有什么想法可以优化表上的查询或索引吗?

最佳答案

您可能想尝试添加 composite index关于(用户,时间记录):

CREATE TABLE IF NOT EXISTS `log` (
  ...
  KEY `user_timeLogged` (user, timeLogged),
  ...
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

相关堆栈溢出帖子:

关于sql - MySQL:哪些索引用于简单范围选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3709926/

相关文章:

mysql - 搜索按钮不起作用,它说没有选择数据库,如何解决这个问题?

与 select() 混淆 - stdout 从未准备好写入

Mysql 选择执行和不执行的行

php - 如何将查询返回的两个字段加载到关联数组中?

sql - 聚集索引是否比包含包含的非聚集索引更快?

php - php/mysql 中的时间限制

c++ - vc++ (sqlite) 如何区分语句是 SELECT - 还是 NOT?

sql - 如何根据同一表列中的值在 SQL 中进行 SELECT?

c# - 在 ASP.NET Web 窗体网站上存储和显示图像

python - 使用 Python 的 SQL 中的嵌套循环和 SELECT 语句