简体   繁体   English

PHP变量和极慢的MySQL查询

[英]PHP variables and extremely slow MySQL query

I have the following PHP code which gets data from a form, and the MySQL query which takes over 15 minutes to complete. 我有以下PHP代码,这些代码从表单获取数据,而MySQL查询则需要15分钟以上才能完成。 It needs to be much faster. 它需要更快。 I'm wondering if I am neglecting any best practices for using PHP variables and MySQL queries, and/or if the query structure itself is responsible for the unacceptable length of time it takes to complete. 我想知道我是否忽略了使用PHP变量和MySQL查询的最佳实践,和/或查询结构本身是否造成了不可接受的时间长度。

The basic purpose of the query is to count the number of times the voters PK appears as the votes FK, and select the corresponding record from the voters table if the count is above a predefined number (a percentage based on the calculation done on the final PHP conditional statement, and the part of the query that filters out everything beyond 2004). 该查询的基本目的是计算选民PK作为选票FK出现的次数,如果该计数超过预定义的数字(则根据最终结果计算得出的百分比),从选民表中选择相应的记录。 PHP条件语句,以及查询部分,用于过滤掉2004年以后的所有内容)。

The voters table has 1 million rows, while the votes table has 7 million, both CountyEMSID keys are indexed, however I'm not allowed to change the table structures, and data will only ever be read from them, never written to. 选民表有100万行,而投票表有700万行,两个CountyEMSID键都已建立索引,但是我不允许更改表结构,并且永远只能从中读取数据,而永远不会写入数据。 Any advice or suggestions on how to speed things up will be greatly appreciated! 关于如何加快速度的任何建议将不胜感激!

Also, sorry for the essay :P 另外,很抱歉这篇文章: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)
)

Appears simple on its face: you need to use indexes. 看起来很简单:您需要使用索引。 I see none in your schema dump. 我看不到您的架构转储中。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM