【发布时间】:2011-05-25 03:18:51
【问题描述】:
我对索引感到迷茫。我正在为客户端构建一个中等复杂的 Web 应用程序,它有几个 count(*) 查询,这些查询都运行得很慢(0.3 秒)
这是一个简单的例子
SELECT COUNT( * ) AS `count`
FROM `vehicles`
WHERE `VehicleLocation_province` = 'Alberta'
AND `default_image_URI` IS NOT NULL
AND `default_image_URI` != ''
这里是解释..
1 SIMPLE vehicles ref VehicleLocation_province,VehicleLocation_province_... VehicleLocation_province 2 const 14128 Using where
我什至无法让这个查询使用正确的索引,更不用说一些更复杂的查询,例如
SELECT * , ( 6371 * ACOS( COS( RADIANS( 53.543564 ) ) * COS( RADIANS( lat ) ) * COS( RADIANS( lng ) - RADIANS( - 113.490456 ) ) + SIN( RADIANS( 53.543564 ) ) * SIN( RADIANS( lat ) ) ) ) AS `distance`
FROM `vehicles`
WHERE `Make` = 'Pontiac'
AND `BodyStyle` = 'Sedan'
AND `VehiclePrice` >= '1'
AND `VehiclePrice` <= '36000'
AND `VehiclePrice` IS NOT NULL
AND `default_image_URI` IS NOT NULL
AND `default_image_URI` != ''
HAVING `distance` < 50
ORDER BY `VehicleReceivedDate` DESC LIMIT 25
解释
1 SIMPLE vehicles ref Make,BodyStyle,VehicleLocation_province_2 Make 99 const 5821 Using where; Using filesort
我知道我需要在可能的情况下避免使用临时表和文件排序...但是当必须对每个请求执行多个 count(*) 查询并使用不同的 where 参数分组和排序时,这实际上是如何实现的?
【问题讨论】:
-
这是 InnoDB 还是 MyISAM?它们在性能、索引和计数(*)方面完全不同。
-
@cherouvim,当然它们并不完全不同 :) - 一些一般规则仍应适用
-
MyISAM。显然 count(*) 性能在 InnoDB 中受到严重影响(所以我读过)
标签: mysql database indexing query-optimization