请帮助优化MYSQL表和/或查询

时间:2011-01-20 13:40:13

标签: mysql optimization indexing group-by

我需要做类似的事情(请参阅左侧的搜索过滤器) http://www.indeed.com/jobs?q=php&l=NY

我已经完成了我所知道的一切,即使它变得比以前快得多,但它仍然不够快。我有许多进一步的优化想法,但它们基本上是盲目的,我不知道这是否会起作用。因此,请检查我当前的代码,并告诉我是否有一些严重错误或某些我忽略的地方。下面是表的结构,它有大约10万个条目,并且非常巨大 - 根据phpmyadmin的640 MiB。下面是我用来收集过滤器数据的查询之一,我不会在这里复制其他查询,因为它们实际上是相同的。查询时间从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 

2 个答案:

答案 0 :(得分:1)

尝试在status, country, job_title上添加索引,并执行执行查询计划以检查效果

答案 1 :(得分:0)

考虑第一,第二,第三和第四个数据库正常形式: http://en.wikipedia.org/wiki/Database_normalization