代码之家  ›  专栏  ›  技术社区  ›  Codler

优化sql查询

  •  1
  • Codler  · 技术社区  · 15 年前

    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 |
    +----+-------------+-------------------+-------+---------------+-------+---------+------+------+----------------------------------------------+
    
    3 回复  |  直到 15 年前
        1
  •  1
  •   Arnaud Bienvenu    15 年前

    要优化性能,请在startIpNum和endIpNum上创建索引。

    在geolitecity_块上创建索引索引_startIpNum(startIpNum);

        2
  •  0
  •   jrage99    15 年前

    对分组或排序的列进行索引几乎总是可以提高性能。我建议将此查询插入DTA(数据库优化顾问)中,以查看SQL是否可以提供任何建议,这可能包括创建一个或多个索引以及统计信息。

        3
  •  0
  •   Skarab    15 年前

    如果在您的用例中可能,请创建一个临时表 TMP_结果 . 非常慢,而且(在您的例子中)无法避免此操作,因为您不按任何键/索引进行排序。表演 计数 操作时,你必须扫描完整的表格。临时表是一种更快的解决方案。

    在(startIpNum,endIpNum)上添加一个索引肯定会帮助您获得更好的性能,但是--如果您有很多行--这并不是一个巨大的改进。