我不知道如何解决这个问题,我想运行一个客户端请求的小计数查询。
这是问题所在。 我正在现场工作,有73,000多名(超过73,000名)学员,而且它的成长会越来越多。
我的网站托管在godaddy服务器上。
此外,受训人员可以接受1次以上的培训,而且客户希望显示受训人员正在接受多少次培训。
事情是还有哪些地方和喜欢应用于查询cuz,我认为查询没有执行,因为它对于db变得太多了。
如何解决这个问题,我怎样才能更快(如果不快,那么甚至执行它)。
经过太多等待后,我得到Apache服务器错误。
这就是它应该如何工作,它在我的机器上本地数据库和1,000多条记录本地工作正常。
它是服务器问题,它不是那么强大,或者是查询不正确,应该修复?
任何帮助都会很棒,因为我陷入其中并且我无法修复它。
= - = - = - = - = - = - = - =
更新我的问题说明:
这些是我的一些表结构。
/*Table structure for table `ml_district` */
DROP TABLE IF EXISTS `ml_district`;
CREATE TABLE `ml_district` (
`District_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`District` VARCHAR(255) DEFAULT NULL,
`enabled` TINYINT(1) UNSIGNED NOT NULL DEFAULT '1',
`trashed` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`District_id`)
) ENGINE=INNODB AUTO_INCREMENT=29 DEFAULT CHARSET=latin1;
/*Table structure for table `organisation` */
DROP TABLE IF EXISTS `organisation`;
CREATE TABLE `organisation` (
`Organisation_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`District_id` INT(11) DEFAULT NULL,
`Province_id` INT(11) DEFAULT NULL,
`school_Dept_name` VARCHAR(255) NOT NULL,
`phone_no` VARCHAR(255) DEFAULT NULL,
`Mobile_no` VARCHAR(255) DEFAULT NULL,
`Email` VARCHAR(255) DEFAULT NULL,
`trashed` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`Organisation_id`)
) ENGINE=INNODB AUTO_INCREMENT=77437 DEFAULT CHARSET=latin1;
/*Table structure for table `trainee` */
DROP TABLE IF EXISTS `trainee`;
CREATE TABLE `trainee` (
`Trainee_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`Gender_id` INT(11) UNSIGNED NOT NULL,
`BPS_id` INT(11) DEFAULT NULL,
`Designation_id` INT(11) DEFAULT NULL,
`Organisation_id` INT(11) UNSIGNED NOT NULL,
`Trainee_name` VARCHAR(100) DEFAULT NULL,
`father_husband_name` VARCHAR(100) DEFAULT NULL,
`CNIC` VARCHAR(100) DEFAULT NULL,
`Mobile_no` VARCHAR(100) DEFAULT NULL,
`trashed` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`Trainee_id`),
UNIQUE KEY `CNICUnique` (`CNIC`)
) ENGINE=INNODB AUTO_INCREMENT=73266 DEFAULT CHARSET=latin1;
/*Table structure for table `trainee_training_enrolment` */
DROP TABLE IF EXISTS `trainee_training_enrolment`;
CREATE TABLE `trainee_training_enrolment` (
`Enrolment_id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`Trainee_id` INT(11) UNSIGNED NOT NULL,
`schedule_id` INT(11) UNSIGNED NOT NULL,
`trashed` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`Enrolment_id`)
) ENGINE=INNODB AUTO_INCREMENT=112512 DEFAULT CHARSET=latin1;
我的查询也是这样的。
SELECT
COUNT(1) AS Total
FROM
`trainee` `T`
LEFT JOIN `ml_designation` `MLDG`
ON `MLDG`.`Designation_id` = `T`.`Designation_id`
AND `MLDG`.`trashed` = 0
LEFT JOIN `organisation` `O`
ON `O`.`Organisation_id` = `T`.`Organisation_id`
AND `O`.`trashed` = 0
LEFT JOIN `trainee_training_enrolment` `TTE`
ON `TTE`.`Trainee_id` = `T`.`Trainee_id`
LEFT JOIN `ml_district` `MLD`
ON `MLD`.`District_id` = `O`.`District_id`
AND `MLD`.`trashed` = 0
LEFT JOIN `ml_gender` `MLG`
ON `MLG`.`Gender_id` = `T`.`Gender_id`
AND `MLG`.`trashed` = 0
WHERE (LOWER(Trainee_name) LIKE '%m%' ESCAPE '!'
OR LOWER(T.CNIC) LIKE '%m%' ESCAPE '!'
OR LOWER(MLD.District) LIKE '%m%' ESCAPE '!'
OR LOWER(O.school_Dept_name) LIKE '%m%' ESCAPE '!'
OR LOWER(T.father_husband_name) LIKE '%m%' ESCAPE '!'
OR LOWER(T.father_husband_name) LIKE '%m%' ESCAPE '!'
OR LOWER(MLG.Gender) LIKE '%m%' ESCAPE '!'
OR LOWER(T.Mobile_no) LIKE '%m%' ESCAPE '!')
AND `T`.`trashed` = 0
AND `T`.`Gender_id` = '1'
答案 0 :(得分:1)
从您的查询中,您可以在
上设置全文索引(LOWER(Trainee_name) LIKE '%m%' ESCAPE '!'
OR LOWER(T.CNIC) LIKE '%m%' ESCAPE '!'
OR LOWER(MLD.District) LIKE '%m%' ESCAPE '!'
OR LOWER(O.school_Dept_name) LIKE '%m%' ESCAPE '!'
OR LOWER(T.father_husband_name) LIKE '%m%' ESCAPE '!'
OR LOWER(T.father_husband_name) LIKE '%m%' ESCAPE '!'
OR LOWER(MLG.Gender) LIKE '%m%' ESCAPE '!'
OR LOWER(T.Mobile_no) LIKE '%m%' ESCAPE '!')
并使用匹配而不是喜欢 https://dev.mysql.com/doc/refman/5.5/en/fulltext-search.html
作为提高执行时间的一种手段 (全文索引仅适用于myISAM引擎)
答案 1 :(得分:1)
您需要 trainee_training_enrolment.Trainee_id
的索引如果没有该索引,MySQL必须为每位受训者全面扫描 trainee_training_enrolment ( trashed = 0 AND Gender_id ='1')。