可以优化这个查询吗?
SELECT count(locId) AS antal , locId
FROM `geolitecity_block`
WHERE (1835880985>= startIpNum AND 1835880985 <= endIpNum)
OR (1836875969>= startIpNum AND 1836875969 <= endIpNum)
OR (1836878754>= startIpNum AND 1836878754 <= endIpNum)
...
...
OR (1843488110>= startIpNum AND 1843488110 <= endIpNum)
GROUP BY locId ORDER BY antal DESC LIMIT 100这张桌子看起来像这样
CREATE TABLE IF NOT EXISTS `geolitecity_block` (
`startIpNum` int(11) unsigned NOT NULL,
`endIpNum` int(11) unsigned NOT NULL,
`locId` int(11) unsigned NOT NULL,
PRIMARY KEY (`startIpNum`),
KEY `locId` (`locId`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;更新和解释查询如下所示
+----+-------------+-------------------+-------+---------------+-------+---------+------+------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------------------+-------+---------------+-------+---------+------+------+----------------------------------------------+
| 1 | SIMPLE | geolitecity_block | index | PRIMARY | locId | 4 | NULL | 108 | Using where; Using temporary; Using filesort |
+----+-------------+-------------------+-------+---------------+-------+---------+------+------+----------------------------------------------+发布于 2010-09-22 18:35:59
对正在分组或排序的列进行索引,几乎总是会提高性能。我建议将这个查询插入DTA (数据库调优顾问),看看SQL是否可以提出任何建议,这可能包括除了统计之外创建一个或多个索引。
发布于 2010-09-22 18:55:22
如果在您的用例中可能的话,创建一个临时表TMP_RESULT (移除订单),而不是提交由antal生成的第二个订单查询。Filesort非常慢,而且--在您的情况下--您无法避免这个操作,因为您没有按任何键/索引进行排序。要执行计数操作,必须扫描完整的表。临时表是一个更快的解决方案。
ps。在(startIpNum,endIpNum)上添加一个索引肯定会帮助您获得更好的性能,但是--如果您有很多行--这不是一个很大的改进。
https://stackoverflow.com/questions/3718843
复制相似问题