mysql很慢怎么办?

时间:2015-11-14 11:13:58

标签: php mysql

我不知道如何解决这个问题,我想运行一个客户端请求的小计数查询。

这是问题所在。 我正在现场工作,有73,000多名(超过73,000名)学员,而且它的成长会越来越多。

我的网站托管在godaddy服务器上。

此外,受训人员可以接受1次以上的培训,而且客户希望显示受训人员正在接受多少次培训。

事情是还有哪些地方和喜欢应用于查询cuz,我认为查询没有执行,因为它对于db变得太多了。

如何解决这个问题,我怎样才能更快(如果不快,那么甚至执行它)。

经过太多等待后,我得到Apache服务器错误。

这就是它应该如何工作,它在我的机器上本地数据库和1,000多条记录本地工作正常。

enter image description here

但在线我收到此错误。 enter image description here

它是服务器问题,它不是那么强大,或者是查询不正确,应该修复?

任何帮助都会很棒,因为我陷入其中并且我无法修复它。

= - = - = - = - = - = - = - =

更新我的问题说明:

这些是我的一些表结构。

/*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' 

2 个答案:

答案 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')。