php - 优化查询性能

标签 php mysql database

由于我的mysql表中的数据较多,我的应用程序(使用php)性能非常慢,我的表结构如下,

`CREATE TABLE `xxxxx` 
(`ID` int(11) NOT NULL AUTO_INCREMENT,
 `IP` varchar(45) NOT NULL,
 `Cname` varchar(45) NOT NULL,
 `Port` int(5) NOT NULL DEFAULT'3306',
 `Variable` varchar(150) DEFAULT NULL,
 `status` varchar(100) DEFAULT NULL,
 `moddate` datetime NOT NULL,
 `Servertime` datetime NOT NULL,
 PRIMARY KEY (`ID`,`moddate`),
 KEY `idx_variable` (`Variable`) ) 
  ENGINE=InnoDB AUTO_INCREMENT=85054928 DEFAULT CHARSET=ucs2
    /*!50100 PARTITION BY LIST ( MONTH (moddate))
    (PARTITION Jan VALUES IN (1) ENGINE = InnoDB,
    PARTITION Feb VALUES IN (2) ENGINE = InnoDB,
    PARTITION Mar VALUES IN (3) ENGINE = InnoDB,
    PARTITION Apr VALUES IN (4) ENGINE = InnoDB,
    PARTITION May VALUES IN (5) ENGINE = InnoDB,
    PARTITION Jun VALUES IN (6) ENGINE = InnoDB,
    PARTITION Jul VALUES IN (7) ENGINE = InnoDB,
    PARTITION Aug VALUES IN (8) ENGINE = InnoDB,
    PARTITION Sep VALUES IN (9) ENGINE = InnoDB,
    PARTITION Oct VALUES IN (10) ENGINE = InnoDB,
    PARTITION Nov VALUES IN (11) ENGINE = InnoDB,
    PARTITION DECM VALUES IN (12) ENGINE = InnoDB) */`

它有大约 4.2 GB 的数据。我用于获取数据的选择语句是,

SELECT 
      `status`,
      `moddate` 
   FROM 
      `xxxxxx` 
   WHERE 
          Cname='xxxx' 
      and ip='0.0.0.0' 
      and port='3306' 
      and Variable='xxxxxx' 
      and status REGEXP '^[0-9]+$|^ON$' 
      and moddate between '2015-01-01 00:47' and '2015-02-01 01:07';

但需要 4:00 分钟。 15天以来我一直被这个问题困扰。我知道我们需要在列上放置索引。但我不知道如何优化这个。请问有人可以建议我哪个字段需要索引吗?或分享任何其他链接来优化我的应用程序。谢谢...

最佳答案

我会查看 where 子句并尝试首先确定较小的结果集字段是什么,并将其放在复合索引的第一个位置

您可能有许多针对客户端“xxxxx”的条目,但 IP 地址的条目较少。不确定你的“变量”上下文是什么,也许这个更小。但我会尝试一下

( IP, port, cname, variable, moddate, status )

但这基本上是几乎所有内容的索引。所以,话虽这么说,我可能会根据……来削减它以查看性能。

( IP, port, cname, moddate )

经过更多思考后,将 CName 放在第一位可能会更好......

( CName, IP, port, variable, moddate, status )

据我所知,cname 可能就像一个网站地址,并且由于单个 IP 上的服务器可以托管许多网站名称,因此 CName 将小于整个 IP 地址。

关于php - 优化查询性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29511436/

相关文章:

mysql - DATE_ADD 和 INTERVAL 函数中的语法错误

ruby-on-rails - rails 重构技巧

php - 如何从 PhoneGaps 文件传输 API 检索 POST 数据

java - com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException 插入mysql错误

php - 如何向用户呈现大量重复数据

mysql复合外键引用超过2个属性

java - Netbeans 数据库资源管理器和 Microsoft SQL Server 无法相处

php - 流输出到文本文件php centos

PHP array_merge_recursive 不能按我的意愿工作

php - 捕获 PDO fatal error 并抛出异常