独特与索引

时间:2011-04-23 15:19:11

标签: mysql

所以我针对这3行的索引3行与唯一键进行了一些测试。结果让我感到惊讶。

CREATE TABLE locations (
    locationid INT(10)     NOT NULL PRIMARY KEY AUTO_INCREMENT,
    country    INT(2)      NOT NULL,
    state      INT(2)      NOT NULL,
    city       VARCHAR(64) NOT NULL,
    INDEX(`country`),
    INDEX(`state`),
    INDEX(`city`)
);    

VS

CREATE TABLE locations (
    locationid INT(10)     NOT NULL PRIMARY KEY AUTO_INCREMENT,
    country    INT(2)      NOT NULL,
    state      INT(2)      NOT NULL,
    city       VARCHAR(64) NOT NULL,
    UNIQUE(`country`, `state`, `city`)
);

所以我试着做一些自动完成,我发现带有3个索引的表比单个唯一键的表工作得更快。自动完成sql看起来像......

<?php 
    $query = "SELECT state, city 
              FROM locations
              WHERE city LIKE '$city%' and state=$state and country='US';";

    $mysqli->query($query);
?>

我注意到上面的代码运行速度有点慢,所以我去了mysql并尝试输入,平均而言,单个唯一键的运行速度大约是5倍......为什么?

2 个答案:

答案 0 :(得分:0)

这是所有3个字段的索引

 UNIQUE(`country`, `state`, `city`)

这是3个字段上的3个索引:

INDEX(`country`),
INDEX(`state`),
INDEX(`city`)

(我猜你没有在合并中使用索引)

答案 1 :(得分:0)

您的第一个示例是唯一的composite index。您的第二个示例包含三个非唯一索引。这是一个非常大的差异。

要查看在这些情况下实际使用的索引,请在查询中运行EXPLAIN

请记住,表中的行数以及各个索引的基数/选择性也将决定是否使用索引。