如何在mysql中明智地应用索引

Posted

技术标签:

【中文标题】如何在mysql中明智地应用索引【英文标题】:How to judiciously apply indexes in mysql 【发布时间】:2012-09-01 06:05:44 【问题描述】:

索引主要用于提高数据库查询的速度,最适合应用在表的主键上,但不一定总是如此。

我想知道应用索引并因此获得最佳结果的决策。

因为我对索引的了解并非仅限于将其应用于主键,否则我会在什么情况下应用它

【问题讨论】:

我应该删除这些问题吗,这个问题要关闭了? 是的,这是一个非常有趣的话题,但不幸的是它不适合 SO 的 QA 格式。 我应该让它更具体吗? @dystroy 这可能是一个解决方案。但请注意,很难以简洁的方式公开非平凡的表索引的完整要求。 【参考方案1】:

尽管index 被广泛使用,但最好在语句的WHERE 子句和ORDER BY 子句中经常使用的任何列上使用它们。

以下表为例:

CREATE TABLE `people` (
    `id` int,
    `name` varchar(255),
    `phone` varchar(10),
    `state` varchar(50),
    `city` varchar(100),
    `zip` int
);

默认情况下,您可能只有id 列上的索引。现在,假设您的数据库中有 20k“人”。当通过 id 字段以外的任何字段进行搜索时,您可能会开始注意到一些滞后。这就是索引的用武之地。

很有可能您不会通过 phone 字段进行搜索(可能,但不太可能),因此我们不会索引该字段。但是,通过state/city/zip 进行搜索的可能性更大。当您按城市/州搜索时,您通常会同时使用 WHERE 子句搜索它们,类似于:

WHERE state = 'Florida' AND city = 'Miami';

因为它们经常一起使用,所以您应该使用 both 字段创建索引(请参阅multiple-column indexes)。另一方面,当您通过zip 进行搜索时,您通常会在没有附加城市/州的情况下进行搜索,例如:

WHERE zip = 12345;

这样,您将仅使用 zip 字段创建索引。

另外,值得注意的是,索引不仅占用空间,还需要在任何INSERTUPDATE 与它们一起在表上进行修改。如果您有大量索引和 很多 条记录,则可以开始注意到单个 INSERT 的时间。因此,请确保您确实需要索引将提供的额外性能提升,然后再添加它们,例如 salt+pepper。

【讨论】:

preciseeeeeely 我在找什么,一个非常简洁的例子,谢谢@newfurniturey

以上是关于如何在mysql中明智地应用索引的主要内容,如果未能解决你的问题,请参考以下文章

如何明智地裁剪图像形状?

如何在 SQL Server 中明智地打印表格行?

如何在 Laravel 中明智地获取产品类别?

如何在 python 中明智地组合两个 numpy 数组元素?

如何在类别中创建 UITableViewCell 明智地排列 JSON 对象

如何在 DOM Element 上明智地构建这个函数类型?