PHP 变量和极慢的 MySQL 查询

标签 php mysql performance variables

我有以下 PHP 代码,它从表单获取数据,MySQL 查询需要 15 分钟以上才能完成。它需要更快。我想知道我是否忽略了使用 PHP 变量和 MySQL 查询的任何最佳实践,和/或查询结构本身是否导致了完成所需的 Not Acceptable 时间长度。

该查询的基本目的是统计选民 PK 作为选票 FK 出现的次数,如果计数高于预定义的数字(基于计算完成的百分比),则从选民表中选择相应的记录在最终的 PHP 条件语句上,以及过滤掉 2004 年之后所有内容的查询部分)。

选民表有 100 万行,而投票表有 700 万行,两个 CountyEMSID 键都已索引,但是我不允许更改表结构,并且数据只能从其中读取,而永远不会写入。任何有关如何加快速度的建议或建议将不胜感激!

另外,对这篇文章感到抱歉:P

/* ========== GET VALUES ========== */
if (isset($_GET["StreetName"])) { $searchStreetName = $_GET["StreetName"]; } else { $searchStreetName = "%"; }
if (isset($_GET["City"])) { $searchCity = $_GET["City"]; } else { $searchCity = "%"; }
if (isset($_GET["Zip"])) { $searchZip = $_GET["Zip"]; } else { $searchZip = "%"; }
if (isset($_GET["DOBY"])) { $searchDOBY = $_GET["DOBY"]; } else { $searchDOBY = "%"; }
if (isset($_GET["DOBM"])) { $searchDOBM = $_GET["DOBM"]; } else { $searchDOBM = "%"; }
if (isset($_GET["DOBD"])) { $searchDOBD = $_GET["DOBD"]; } else { $searchDOBD = "%"; }
if (isset($_GET["Gender"])) { $searchGender = $_GET["Gender"]; } else { $searchGender = "%"; }
if (isset($_GET["Party"])) { $searchParty = $_GET["Party"]; } else { $searchParty = "%"; }
if (isset($_GET["ED"])) { $searchED = $_GET["ED"]; } else { $searchED = "%"; }
if (isset($_GET["AD"])) { $searchAD = $_GET["AD"]; } else { $searchAD = "%"; }
if (isset($_GET["CD"])) { $searchCD = $_GET["CD"]; } else { $searchCD = "%"; }
if (isset($_GET["CO"])) { $searchCO = $_GET["CO"]; } else { $searchCO = "%"; }
if (isset($_GET["SD"])) { $searchSD = $_GET["SD"]; } else { $searchSD = "%"; }
if (isset($_GET["CC"])) { $searchCC = $_GET["CC"]; } else { $searchCC = "%"; }
if (isset($_GET["VoterActivity"])) { $searchVoterActivity = (($_GET["VoterActivity"] / 100) * 18); } else { $searchVoterActivity = "0"; }

/* ========== GET DATA ========== */
$sql = "SELECT voters.*, COUNT(votes.CountyEMSID) AS 'activity'
FROM voters INNER JOIN votes ON voters.CountyEMSID = votes.CountyEMSID
WHERE voters.StreetName LIKE '$searchStreetName%'
AND voters.City LIKE '$searchCity%'
AND voters.Zip LIKE '$searchZip%'
AND voters.DOBY LIKE '%$searchDOBY'
AND voters.DOBM LIKE '%$searchDOBM'
AND voters.DOBD LIKE '%$searchDOBD'
AND voters.Gender LIKE '$searchGender%'
AND voters.Party LIKE '$searchParty%'
AND voters.ED LIKE '%$searchED'
AND voters.AD LIKE '%$searchAD'
AND voters.CD LIKE '%$searchCD'
AND voters.CO LIKE '%$searchCO'
AND voters.SD LIKE '%$searchSD'
AND voters.CC LIKE '%$searchCC'
AND votes.ElectionDateY >= 2004
AND (
votes.ElectionType = 'GE'
OR votes.ElectionType = 'PR'
OR votes.ElectionType = 'PP'
)
GROUP BY votes.CountyEMSID
HAVING COUNT(votes.CountyEMSID) >= '$searchVoterActivity'
ORDER BY voters.LastName, voters.FirstName, voters.DOBY, voters.DOBM, voters.DOBD ASC
LIMIT $start, $limit";

/* ========== CREATE TABLE ========== */
CREATE TABLE voters (
    CountyEMSID varchar(9) NOT NULL,
    LastName varchar(30) NOT NULL,
    FirstName varchar(30) NOT NULL,
    MiddleInitial varchar(1) NOT NULL,
    NameSuffix varchar(4) NOT NULL,
    HouseNumber varchar(10) NOT NULL,
    HouseNumberSuffix varchar(10) NOT NULL,
    ApartmentNumber varchar(15) NOT NULL,
    StreetName varchar(50) NOT NULL,
    City varchar(40) NOT NULL,
    Zip varchar(5) NOT NULL,
    ZipCode4 varchar(4) NOT NULL,
    MailingAddress1 varchar(50) NOT NULL,
    MailingAddress2 varchar(50) NOT NULL,
    MailingAddress3 varchar(50) NOT NULL,
    MailingAddress4 varchar(50) NOT NULL,
    DOBY varchar(4) NOT NULL,
    DOBM varchar(2) NOT NULL,
    DOBD varchar(2) NOT NULL,
    Gender varchar(1) NOT NULL,
    Party varchar(3) NOT NULL,
    Other varchar(30) NOT NULL,
    ED varchar(3) NOT NULL,
    AD varchar(2) NOT NULL,
    CD varchar(2) NOT NULL,
    CO varchar(2) NOT NULL,
    SD varchar(2) NOT NULL,
    CC varchar(2) NOT NULL,
    RegY varchar(4) NOT NULL,
    RegM varchar(2) NOT NULL,
    RegD varchar(2) NOT NULL,
    Status varchar(2) NOT NULL,
    VoterType varchar(1) NOT NULL,
    StatusChangeY varchar(4) NOT NULL,
    StatusChangeM varchar(2) NOT NULL,
    StatusChangeD varchar(2) NOT NULL,
    LastVoted varchar(4) NOT NULL,
    Telephone varchar(12) NOT NULL,
    KEY CountyEMSID (CountyEMSID)
)

/* ========== CREATE TABLE ========== */
CREATE TABLE votes (
    CountyEMSID varchar(9) NOT NULL,
    County varchar(2) NOT NULL,
    AD varchar(2) NOT NULL,
    ED varchar(3) NOT NULL,
    Party varchar(3) NOT NULL,
    ElectionDateY varchar(4) NOT NULL,
    ElectionDateM varchar(2) NOT NULL,
    ElectionDateD varchar(2) NOT NULL,
    ElectionType varchar(2) NOT NULL,
    VoterType varchar(1) NOT NULL,
    KEY CountyEMSID (CountyEMSID)
)

最佳答案

表面上看起来很简单:您需要使用索引。我在您的架构转储中没有看到任何内容。

关于PHP 变量和极慢的 MySQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10423472/

相关文章:

mysql - 如何在 Order By Asc 中将特定值放在底部?

MySQL:我使用 TINYTEXT 还是 VARCHAR(6) 作为短词

c++ - 如何找出我的代码的哪一部分正在减慢我的 C++ 程序

performance - OpenGL在渲染“虚拟画廊”(纹理)方面的性能

php - 根据需要在 PHP 和 MySQL 中添加更多 AND 运算符

php - 正则表达式替换网页中的单词

c# mysql datetime 到 unix 时间

excel - 微软 Excel : how can I make Max() more efficient?

php - 相关产品 SQL 查询

php - 如何对 PHP 特征进行单元测试