优化MySQL表速度的方法

优化MySQL表速度的方法,mysql,performance,Mysql,Performance,我目前正在为我的雇主开发kpi仪表板 仪表板显示来自mysql数据库的各种KPI。 不幸的是,查询速度非常慢,尽管我尝试了在博客和堆栈溢出上找到的所有优化建议 该表约有1670万行 下面是表的Create语句: CREATE TABLE `V12` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `date_id` int(3) unsigned NOT NULL, `vorgang_id` int(1) unsigned NOT N

我目前正在为我的雇主开发kpi仪表板

仪表板显示来自mysql数据库的各种KPI。 不幸的是,查询速度非常慢,尽管我尝试了在博客和堆栈溢出上找到的所有优化建议

该表约有1670万行

下面是表的Create语句:

CREATE TABLE `V12` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `date_id` int(3) unsigned NOT NULL,
  `vorgang_id` int(1) unsigned NOT NULL,
  `sparte_id` int(2) unsigned NOT NULL,
  `standort_id` int(2) unsigned NOT NULL,
  `verteilungsziel_id` int(2) unsigned NOT NULL,
  `haupttyp_id` int(3) unsigned NOT NULL,
  `kpi_id` int(2) unsigned NOT NULL,
  `value` float NOT NULL,
  PRIMARY KEY (`id`),
  KEY `date_idx` (`date_id`),
  KEY `vorgang_idx` (`vorgang_id`),
  KEY `sparte_idx` (`sparte_id`),
  KEY `standort_idx` (`standort_id`),
  KEY `verteilungsziel_idx` (`verteilungsziel_id`),
  KEY `haupttyp_idx` (`haupttyp_id`),
  KEY `kpi_idx` (`kpi_id`),
  CONSTRAINT `date` FOREIGN KEY (`date_id`) REFERENCES `V12_date` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `haupttyp` FOREIGN KEY (`haupttyp_id`) REFERENCES `V12_haupttyp` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `kpi` FOREIGN KEY (`kpi_id`) REFERENCES `V12_kpi` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `sparte` FOREIGN KEY (`sparte_id`) REFERENCES `V12_sparte` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `standort` FOREIGN KEY (`standort_id`) REFERENCES `V12_standort` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `verteilungsziel` FOREIGN KEY (`verteilungsziel_id`) REFERENCES `V12_verteilungsziel` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  CONSTRAINT `vorgang` FOREIGN KEY (`vorgang_id`) REFERENCES `V12_vorgang` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=16761713 DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
所有引用表的构建如下所示:

CREATE TABLE `V12_haupttyp` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `value` varchar(200) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `haupttyp_id_UNIQUE` (`id`),
  UNIQUE KEY `haupttyp_UNIQUE` (`value`)
) ENGINE=InnoDB AUTO_INCREMENT=70 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
# Time: 141211 19:28:24
# User@Host: dashboard[dashboard] @ localhost []
# Query_time: 1.143774  Lock_time: 0.000075 Rows_sent: 8  Rows_examined: 850
SET timestamp=1418322504;
SELECT `id`, `kpi_id` AS `kpi`,  `date_id` AS `date`, `value` FROM `V12` WHERE `date_id` = '581' AND `vorgang_id` = '2' AND `sparte_id` = '6' AND `standort_id` = '1' AND `verteilungsziel_id` = '2' AND `haupttyp_id` = '16';

# Time: 141211 19:28:33
# User@Host: dashboard[dashboard] @ localhost []
# Query_time: 1.094251  Lock_time: 0.000095 Rows_sent: 56  Rows_examined: 608
SET timestamp=1418322513;
SELECT `id`, `sparte_id` AS `sparte`, `kpi_id` AS `kpi`,  `date_id` AS `date`, `value` FROM `V12` WHERE `date_id` = '581' AND `vorgang_id` = '2' AND `standort_id` = '1' AND `verteilungsziel_id` = '2' AND `haupttyp_id` = '16';

# Time: 141211 19:28:38
# User@Host: dashboard[dashboard] @ localhost []
# Query_time: 4.913999  Lock_time: 0.000098 Rows_sent: 1789  Rows_examined: 1789
SET timestamp=1418322518;
SELECT `id`, `sparte_id` AS `sparte`,  `date_id` AS `date`, `value` FROM `V12` WHERE `vorgang_id` = '2' AND `standort_id` = '1' AND `verteilungsziel_id` = '2' AND `haupttyp_id` = '16' AND `kpi_id` = '4';

# Time: 141211 19:29:48
# User@Host: knorr[knorr] @ localhost []
# Query_time: 4.748257  Lock_time: 0.000134 Rows_sent: 2215  Rows_examined: 2215
SET timestamp=1418322588;
SELECT `id`, `standort_id` AS `standort`,  `date_id` AS `date`, `value` FROM `V12` WHERE `vorgang_id` = '2' AND `sparte_id` = '6' AND `verteilungsziel_id` = '2' AND `haupttyp_id` = '16' AND `kpi_id` = '2';
我的查询确实如下所示:

CREATE TABLE `V12_haupttyp` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `value` varchar(200) COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `haupttyp_id_UNIQUE` (`id`),
  UNIQUE KEY `haupttyp_UNIQUE` (`value`)
) ENGINE=InnoDB AUTO_INCREMENT=70 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
# Time: 141211 19:28:24
# User@Host: dashboard[dashboard] @ localhost []
# Query_time: 1.143774  Lock_time: 0.000075 Rows_sent: 8  Rows_examined: 850
SET timestamp=1418322504;
SELECT `id`, `kpi_id` AS `kpi`,  `date_id` AS `date`, `value` FROM `V12` WHERE `date_id` = '581' AND `vorgang_id` = '2' AND `sparte_id` = '6' AND `standort_id` = '1' AND `verteilungsziel_id` = '2' AND `haupttyp_id` = '16';

# Time: 141211 19:28:33
# User@Host: dashboard[dashboard] @ localhost []
# Query_time: 1.094251  Lock_time: 0.000095 Rows_sent: 56  Rows_examined: 608
SET timestamp=1418322513;
SELECT `id`, `sparte_id` AS `sparte`, `kpi_id` AS `kpi`,  `date_id` AS `date`, `value` FROM `V12` WHERE `date_id` = '581' AND `vorgang_id` = '2' AND `standort_id` = '1' AND `verteilungsziel_id` = '2' AND `haupttyp_id` = '16';

# Time: 141211 19:28:38
# User@Host: dashboard[dashboard] @ localhost []
# Query_time: 4.913999  Lock_time: 0.000098 Rows_sent: 1789  Rows_examined: 1789
SET timestamp=1418322518;
SELECT `id`, `sparte_id` AS `sparte`,  `date_id` AS `date`, `value` FROM `V12` WHERE `vorgang_id` = '2' AND `standort_id` = '1' AND `verteilungsziel_id` = '2' AND `haupttyp_id` = '16' AND `kpi_id` = '4';

# Time: 141211 19:29:48
# User@Host: knorr[knorr] @ localhost []
# Query_time: 4.748257  Lock_time: 0.000134 Rows_sent: 2215  Rows_examined: 2215
SET timestamp=1418322588;
SELECT `id`, `standort_id` AS `standort`,  `date_id` AS `date`, `value` FROM `V12` WHERE `vorgang_id` = '2' AND `sparte_id` = '6' AND `verteilungsziel_id` = '2' AND `haupttyp_id` = '16' AND `kpi_id` = '2';
这是我的MySQL配置的链接: 以下是我的v-servers性能概述的链接: 有什么明显的我做错了吗

更新:
我把桌子分成两张桌子。一个大的约1660万行,另一个约有0.1百万行。我将监控用户的行为,并可能调整比率。

您应该采取的第一步是使用,因为了解MySQL如何执行查询对于您所能做的任何优化都是至关重要的。例如,可能您缺少索引。

您的表中有足够的索引吗?嗨,大卫,谢谢您的回答。是的,我添加了索引。我如何知道它们是否足够?在Create语句中,您可以看到它们。:)下面是解释语句的结果:我认为它使用索引。。。