Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL更新查询速度非常慢,带有索引_Mysql_Database_Performance_Indexing - Fatal编程技术网

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更新。。。