我正在建立一个有很多过滤器的网站。每次单击/缩小搜索范围时,都会为所有过滤器重新计算所有计数器。我意识到我在这里造成了一些问题,因为每次点击时,我都会通过大约 50 个计数查询来重新计算所有过滤器。当有许多用户同时使用该站点时,这将产生相当大的数据库负载..
如果您需要更多上下文,过滤器计数器看起来像这样:http: //screencast.com/t/3bxrWTAtm
优化这些计数的最佳方法是什么?我可以使用 memcache,但由于可能会出现新的列表,因此最多必须缓存大约 15-30 分钟。
以下是 COUNT 查询之一的示例:
SELECT COUNT(id) AS numOfRows FROM (SELECT `id`, `theLatitude`, `theLongitude`, ( 3959 * acos( cos( radians(45.5086699) ) * cos( radians( theLatitude ) ) * cos( radians( theLongitude ) - radians(-73.5539925) ) + sin( radians(45.5086699) ) * sin( radians( theLatitude ) ) ) ) AS distance FROM `housing` WHERE (`elevator` = '1') AND ( `property-type` = 'loft' ) HAVING distance < 75) AS `newid`
住房表如下所示:
CREATE TABLE IF NOT EXISTS `housing` (
`id` varchar(10) NOT NULL,
`date` datetime NOT NULL,
`user` varchar(20) NOT NULL,
`email` varchar(50) NOT NULL,
`title` varchar(60) NOT NULL,
`address` varchar(120) DEFAULT NULL,
`formatted_address` varchar(120) NOT NULL,
`theLatitude` double DEFAULT NULL,
`theLongitude` double DEFAULT NULL,
`property-type` varchar(20) NOT NULL,
`square-feet` int(9) DEFAULT NULL,
`bathrooms` double NOT NULL DEFAULT '0',
`bedrooms` int(2) NOT NULL DEFAULT '0',
`price` int(10) DEFAULT NULL,
`priceUSD` int(10) NOT NULL,
`currency` varchar(3) DEFAULT NULL,
`period` varchar(5) DEFAULT NULL,
`lease-terms` varchar(20) NOT NULL,
`available-from` date NOT NULL,
`contactName` varchar(30) NOT NULL,
`contactPhone1` varchar(30) NOT NULL,
`contactPhone2` varchar(30) NOT NULL,
`description` text NOT NULL,
`cats` tinyint(1) NOT NULL DEFAULT '0',
`small-dogs` tinyint(1) NOT NULL DEFAULT '0',
`small-pets` tinyint(1) NOT NULL DEFAULT '0',
`big-dogs` tinyint(1) NOT NULL DEFAULT '0',
`alarm-system` tinyint(1) NOT NULL DEFAULT '0',
`air-conditioning` tinyint(1) NOT NULL DEFAULT '0',
`balcony` tinyint(1) NOT NULL DEFAULT '0',
`carpet-floors` tinyint(1) NOT NULL DEFAULT '0',
`dishwasher` tinyint(1) NOT NULL DEFAULT '0',
`electricity` tinyint(1) NOT NULL DEFAULT '0',
`fireplace` tinyint(1) NOT NULL DEFAULT '0',
`furniture` tinyint(1) NOT NULL DEFAULT '0',
`heating` tinyint(1) NOT NULL DEFAULT '0',
`high-ceilings` tinyint(1) NOT NULL DEFAULT '0',
`hot-water` tinyint(1) NOT NULL DEFAULT '0',
`natural-gas` tinyint(1) NOT NULL DEFAULT '0',
`spa-hot-tub` tinyint(1) NOT NULL DEFAULT '0',
`refrigerator` tinyint(1) NOT NULL DEFAULT '0',
`stove` tinyint(1) NOT NULL DEFAULT '0',
`storage-space` tinyint(1) NOT NULL DEFAULT '0',
`walk-in-closets` tinyint(1) NOT NULL DEFAULT '0',
`washer-dryer` tinyint(1) NOT NULL DEFAULT '0',
`doorman` tinyint(1) NOT NULL DEFAULT '0',
`elevator` tinyint(1) NOT NULL DEFAULT '0',
`health-facilities` tinyint(1) NOT NULL DEFAULT '0',
`inside-parking` tinyint(1) NOT NULL DEFAULT '0',
`laundry-facilities` tinyint(1) NOT NULL DEFAULT '0',
`outside-parking` tinyint(1) NOT NULL DEFAULT '0',
`pool-sauna` tinyint(1) NOT NULL DEFAULT '0',
`wheelchair-access` tinyint(1) NOT NULL DEFAULT '0',
`authnumber` varchar(15) NOT NULL,
`validated` tinyint(1) NOT NULL DEFAULT '0',
主键 ( id
) ) 引擎=MyISAM 默认字符集=latin1;
用户可以过滤 50 多个字段。
任何能指出我正确方向的东西都将不胜感激。