2011-01-20 38 views
0

我需要做一些類似的(參見左側的搜索過濾器) http://www.indeed.com/jobs?q=php&l=NY請幫助優化MySQL表和/或查詢

我已經做了一切,我知道即使它比很多快成了它曾經,它還不夠快。我有很多進一步的優化想法,但他們基本上是盲目的,我不知道這是否會起作用。所以請檢查我現在的代碼,並告訴我是否有一些嚴重的錯誤或我忽視的某個地方。下面是表的結構,它有大約10萬個條目,並且非常龐大 - 根據phpmyadmin的大小爲640MB。下面是我用來收集過濾器數據的查詢之一,我不會在這裏複製其他查詢,因爲它們實際上是相同的。查詢時間從0.5到1秒不等,在我爲每個需要的過濾器執行查詢後大約5秒鐘內總結了一次。

CREATE TABLE `jobs` (
`id` int(11) NOT NULL auto_increment, 
`employer_id` int(11) NOT NULL default '0', 
`job_title` varchar(255) NOT NULL default '', 
`city` varchar(96) NOT NULL default '', 
`state` varchar(128) NOT NULL default '0', 
`country` varchar(48) NOT NULL default '0', 
`zip` varchar(10) NOT NULL default '0', 
`zlat` double NOT NULL default '0', 
`zlong` double NOT NULL default '0', 
`job_type` varchar(255) NOT NULL default '0', 
`position_type` varchar(255) NOT NULL default '0', 
`req_education` varchar(255) NOT NULL default '0', 
`req_experience` varchar(255) NOT NULL default '0', 
`salary_type` varchar(255) default '0', 
`approx_salary` decimal(10,2) NOT NULL default '0.00', 
`approx_salary_range` decimal(10,2) NOT NULL default '0.00', 
`short_description` varchar(255) NOT NULL default '', 
`long_description` text NOT NULL, 
`pay_low` decimal(10,2) NOT NULL default '0.00', 
`pay_high` decimal(10,2) NOT NULL default '0.00', 
`step_completed` tinyint(1) NOT NULL default '0', 
`num_viewed` int(11) NOT NULL default '0', 
`num_applicants` int(11) NOT NULL default '0', 
`time` int(11) NOT NULL default '0', 
`end_time` int(11) NOT NULL default '0', 
`status` varchar(15) NOT NULL default 'active', 
`service_type` int(11) NOT NULL default '0', 
`req_travel` varchar(255) NOT NULL default '', 
`tele_position` varchar(255) NOT NULL default '', 
`manage_app` varchar(255) NOT NULL default '', 
`apply_email_url` varchar(255) NOT NULL default '', 
`adcourier_email` text NOT NULL, 
`adcourier_url` text NOT NULL, 
`reference_number` varchar(255) NOT NULL, 
`feed_id` int(11) NOT NULL, 
`mods_feed_company_name` varchar(255) NOT NULL COMMENT 'A value in this column automaticaly means that users.is_bot=1 for this employer', 
`current_company_name` varchar(255) NOT NULL COMMENT 'this field lets us avoid JOINs in search queries', 
`salary_total_grouped` int(11) NOT NULL COMMENT 'a calculated field that is used to speed up search', 
`company_type_grouped` varchar(30) NOT NULL COMMENT 'a calculated field that is used to speed up search', 
`location_grouped` varchar(100) NOT NULL COMMENT 'a calculated field that is used to speed up search', 
PRIMARY KEY (`id`), 
KEY `employer_id` (`employer_id`), 
KEY `status` (`status`), 
KEY `zip` (`zip`), 
KEY `zlat` (`zlat`), 
KEY `zlong` (`zlong`), 
KEY `feed_id` (`feed_id`), 
KEY `service_type` (`service_type`), 
KEY `time` (`time`), 
KEY `job_title` (`job_title`), 
KEY `short_description` (`short_description`), 
KEY `current_company_name` (`current_company_name`), 
KEY `salary_total_grouped` (`salary_total_grouped`), 
KEY `location_grouped` (`location_grouped`), 
KEY `company_type_grouped` (`company_type_grouped`), 
KEY `position_type` (`position_type`), 
KEY `job_type` (`job_type`), 
KEY `salary_type` (`salary_type`), 
KEY `approx_salary` (`approx_salary`), 
KEY `approx_salary_range` (`approx_salary_range`), 
KEY `country` (`country`), 
KEY `state` (`state`), 
KEY `city` (`city`), 
KEY `end_time` (`end_time`), 
FULLTEXT KEY `long_description` (`long_description`) 
) ENGINE=MyISAM AUTO_INCREMENT=485825 DEFAULT CHARSET=latin1 

SELECT count(jobs.job_title) AS count, jobs.job_title 
FROM jobs 
WHERE jobs.status = 'active' 
AND jobs.country = 'United States' 
GROUP BY jobs.job_title 
ORDER BY count DESC 
LIMIT 14 

回答

1

嘗試在status, country, job_title添加索引,並做執行的查詢計劃,考試表現