dongyinzhi4689 2012-05-03 00:12
浏览 33

PHP变量和极慢的MySQL查询

I have the following PHP code which gets data from a form, and the MySQL query which takes over 15 minutes to complete. 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.

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).

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. Any advice or suggestions on how to speed things up will be greatly appreciated!

Also, sorry for the essay :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)
)
  • 写回答

1条回答 默认 最新

  • dongle3217 2012-05-03 00:14
    关注

    Appears simple on its face: you need to use indexes. I see none in your schema dump.

    评论

报告相同问题?

悬赏问题

  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题