MySQL索引,不同类型及何时使用?

5

好的,关于MySQL索引及其重要性我进行了很多研究,我知道使用它可以使数据库查询运行更快。

而且我知道添加索引的语法。

但是这里有一点我不理解(我正在使用Heidi SQL本地管理数据库)。

我有一个包含以下字段的表:

id
company_id
author_id
client_id
project_id
title
description
status
date

在这里,“id”是“主键”,“自动增量”,已经被索引了。
我想在“company_id”、“author_id”、“client_id”、“project_id”上添加索引,但我有几个不同的选项(Heidi SQL:选择字段,右键单击,创建新索引):“关键字”、“唯一”、“全文”、“空间”。
我知道(猜测)“关键字”只是对字段进行索引,“唯一”将确保该字段必须是唯一的,“全文”索引将在对该字段执行搜索时效果最佳。
问题1:“空间”做什么,什么时候应该使用该索引?
问题2:创建索引时,我有两个选项,要么创建新索引,要么添加到已存在的索引中(比如主字段的名称)。
创建新索引和将索引添加到已存在的索引之间有什么区别?为每个不同的字段创建不同名称的索引是一个好主意,还是应该在同一个名称下创建/添加所有索引?
感谢你的时间。
1个回答

4
您应该从一个简单的关键索引开始。如果您添加了Unique,可能会产生意想不到的后果,例如对公司ID这样的列强制执行唯一性肯定行不通(许多行将共享相同的公司ID)。
空间索引仅用于地理编码数据(纬度/经度值),因此不适用于任何其中之一。全文索引用于在字段内搜索单词时使用,它也不适用于您拥有的数值。此外,全文索引仅在MyISAM中可用,而不在INNODB事务引擎中,因此,如果您希望迁移表,则这将是一个障碍。
如果您添加到现有索引,则正在创建一个“复合”索引,涵盖了多个列。通常情况下,这不是一个好主意,除非您试图在不已经是唯一的索引上通过一个索引来强制执行唯一性。例如,您可以索引:公司ID + ID,并在这种情况下使其唯一。但是,该索引占用更多的空间,并且在写入时速度较慢。
总之,您只需在要搜索的列上使用普通的KEY索引。MySQL每次查询只使用一个索引,要查看它实际访问数据的方式,您可以使用EXPLAIN实用程序。您需要确保它以有效的方式使用索引以缩小需要返回或搜索的行数,以获得最佳性能。

2
复合索引很重要,但应根据您想要优化的特定查询进行设计。请参阅我的演示文稿如何真正设计索引 - Bill Karwin
4
似乎MySQL现在支持使用INNODB进行全文索引/搜索:https://dev.mysql.com/doc/refman/5.6/en/innodb-fulltext-index.html - Paladini

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接