MySQL更新查询速度非常慢,带有索引
执行此查询需要很多时间:MySQL更新查询速度非常慢,带有索引,mysql,database,performance,indexing,Mysql,Database,Performance,Indexing,执行此查询需要很多时间: UPDATE facturacion2013_full a, facturacion2013_contadores b SET a.B1 = b.consumo WHERE a.contador = b.contador 以下是我的表格结构: CREATE TABLE IF NOT EXISTS `facturacion2013_full` ( `id` int(11) NOT NULL AUTO_INCREMENT, `poliza` int(8) NOT
UPDATE facturacion2013_full a, facturacion2013_contadores b SET a.B1 = b.consumo WHERE a.contador = b.contador
以下是我的表格结构:
CREATE TABLE IF NOT EXISTS `facturacion2013_full` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`poliza` int(8) NOT NULL,
`contador` varchar(12) NOT NULL,
`B1` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `fields_idx` (`contador`),
KEY `fields_iidx2` (`poliza`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
CREATE TABLE IF NOT EXISTS `facturacion2013_contadores` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`poliza` int(8) NOT NULL,
`contador` varchar(12) NOT NULL,
`consumo` int(8) NOT NULL,
PRIMARY KEY (`id`),
KEY `idx1` (`contador`),
KEY `idx2` (`poliza`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
我试着改变一些小事情,但运气不好。还尝试更改mysql配置中的一些参数,如缓冲区大小、最大堆大小、表大小。。。我错过了什么?提前谢谢 我在MySQL 5.6上进行了测试,MySQL 5.6确实支持EXPLAIN for UPDATE语句
mysql> explain UPDATE facturacion2013_full a JOIN facturacion2013_contadores b
ON a.contador = b.contador
SET a.B1 = b.consumo\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: a
type: ALL
possible_keys: fields_idx
key: NULL
key_len: NULL
ref: NULL
rows: 1
Extra: NULL
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: b
type: ref
possible_keys: idx1
key: idx1
key_len: 14
ref: test.a.contador
rows: 1
Extra: NULL
您可以看到它读取表a
的所有行。我从表名中假设a
中的行数多于b
中的行数。因此,它从a
读取所有行,无论b
中是否有匹配行
也许可以为MySQL节省一些工作来对表进行重新排序,以便它读取较小表中的所有行,而只读取较大表中匹配的行
mysql> explain UPDATE facturacion2013_contadores b JOIN facturacion2013_full a
ON a.contador = b.contador
SET a.B1 = b.consumo\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: b
type: ALL
possible_keys: idx1
key: NULL
key_len: NULL
ref: NULL
rows: 1
Extra: NULL
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: a
type: ref
possible_keys: fields_idx
key: fields_idx
key_len: 14
ref: test.b.contador
rows: 1
Extra: NULL
表的顺序应该无关紧要,因为优化器应该能够自己对表重新排序,必要时以更好的顺序读取它们。但有时优化器并不像我们希望的那样聪明。或者它甚至可能以使查询更糟的方式对表进行重新排序。您使用的是MySQL 5.1,它已经很旧了(事实上,它的支持寿命已于2013年12月31日结束),所以可能优化器不如新版本好
通过使用stright\u JOIN
关键字,可以覆盖优化器并强制按照查询中给定的顺序读取表:
mysql> explain UPDATE facturacion2013_contadores b STRAIGHT_JOIN facturacion2013_full a
ON a.contador = b.contador
SET a.B1 = b.consumo\G
值得一提的是,您还可以在MySQL 5.1上测试UPDATE语句的优化。将任何UPDATE语句重写为等效的SELECT语句非常简单,目的是查看优化器将如何分析它。只需将集合表达式移动到“选择”列表中
mysql> explain SELECT a.B1 = b.consumo FROM facturacion2013_full a
JOIN facturacion2013_contadores b ON a.contador = b.contador\G
首先使用
EXPLAIN
了解数据库正在做什么。我已经安装了5.1版本,无法使用EXPLAIN更新。。。