MySQL 优化 - 7.5m 行

标签 mysql select optimization large-data

我在 MySQL 中有一个表,其中包含 7,500,000 行,我对查询持续时间有疑问。任何人都可以帮我提供一些技巧以使其更快吗? 表称为“考勤”。它在 col movement_date、employee_id 上有索引,我试图在两个 cols 上创建索引。但是下面的查询大约需要 9 秒,对我来说太慢了。有人有提示吗?我需要使用超过 14 个员工 ID 进行此选择。

SELECT * 
FROM attendance 
WHERE movement_date >= '2014-09-01 00:00:00' 
AND movement_date <= '2014-10-01 23:59:59' 
AND employee_id IN (14 integer ids...);

表定义:

CREATE TABLE `attendance` (
  `attendance_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `attendance_raw_id` int(10) unsigned DEFAULT NULL,
  `employee_id` int(11) NOT NULL,
  `shift_type_id` int(11) DEFAULT NULL,
  `shift_plan_id` int(11) DEFAULT NULL,
  `record_status_id` tinyint(4) DEFAULT ''1'',
  `movement_date` datetime DEFAULT NULL,
  `attendance_movement_type_id` tinyint(4) DEFAULT NULL,
  `note` varchar(50) DEFAULT NULL,
  `created_d` datetime DEFAULT NULL,
  `created_w` int(11) DEFAULT NULL,
  `updated_w` int(11) DEFAULT NULL,
  PRIMARY KEY (`attendance_id`),
  UNIQUE KEY `IDX_attendance_raw_id` (`attendance_raw_id`),
  KEY `IDX_employee_id` (`employee_id`),
  KEY `FK_attendance3` (`attendance_movement_type_id`),
  KEY `IDX_movement_date` (`movement_date`),
  KEY `FK_attendance4` (`record_status_id`),
  KEY `FK_movement_date_employee` (`movement_date`,`employee_id`),
  CONSTRAINT `FK_attendance` FOREIGN KEY (`employee_id`) REFERENCES `employee` (`employee_id`),
  CONSTRAINT `FK_attendance2` FOREIGN KEY (`attendance_raw_id`) REFERENCES `attendance_raw` (`attendance_raw_id`),
  CONSTRAINT `FK_attendance3` FOREIGN KEY (`attendance_movement_type_id`) REFERENCES `attendance_movement_type` (`attendance_movement_type_id`),
  CONSTRAINT `FK_attendance4` FOREIGN KEY (`record_status_id`) REFERENCES `record_status` (`record_status_id`)
) ENGINE=InnoDB AUTO_INCREMENT=9072724 DEFAULT CHARSET=utf8 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC

最佳答案

为了提高结果的速度,你需要这样改变你的sql语句

SELECT * 
FROM attendance 
WHERE movement_date >= '2014-09-01 00:00:00' 
AND movement_date <= '2014-10-01 23:59:59' 
AND employee_id IN(
                   SELECT  indexed_column_IDs
                   FROM    table2 ...
                   )

从一定数量的记录开始,对 SELECT 的 IN 谓词变得比对常量列表更快。

关于MySQL 优化 - 7.5m 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26669505/

相关文章:

excel - 优化 VBA 脚本以组合和整合

mysql - 在mysql数据库laravel中保存多个整数

mysql - 是否可以在 mysql 中安排 cron 任务?

mysql - SQL查询改进(表中的额外列)

php - 使用左连接从选择查询更新

MySQL : INSERT INTO with foreach like

mysql - 加速大表上的简单 UPDATE 查询

c# - 使用 XNA 绘制矩形

PHP 登录重定向循环

mysql - 使用一个参数在 Rails 中搜索通配符多列