表的所有列是否都应该被索引到mysql数据库?

表的所有列是否都应该被索引到mysql数据库?,mysql,performance,indexing,search-engine,Mysql,Performance,Indexing,Search Engine,我想制作一个包含4列的表。一个是主键,其他三列是对其他表的列的引用。我想用它来连接这四个表以生成一个搜索过滤器。这些连接需要时间 我想我应该索引这些列,因为我读到在连接条件中使用的列上添加索引[使它们运行得更快]。我的问题是,如果表中的所有列都被索引,是否会出现问题?或者是否有其他方法可以降低搜索过滤器的时间复杂度。提前谢谢 更多提示: 表1(主搜索)-1000个条目 主键 fk1 fk2 fk3 表2-800条目 pk1 ..(8-9列) 表3-700条目 pk2 ..(10-12列) 表2-

我想制作一个包含4列的表。一个是主键,其他三列是对其他表的列的引用。我想用它来连接这四个表以生成一个搜索过滤器。这些连接需要时间

我想我应该索引这些列,因为我读到在连接条件中使用的列上添加索引[使它们运行得更快]。我的问题是,如果表中的所有列都被索引,是否会出现问题?或者是否有其他方法可以降低搜索过滤器的时间复杂度。提前谢谢

更多提示: 表1(主搜索)-1000个条目 主键 fk1 fk2 fk3

表2-800条目 pk1 ..(8-9列)

表3-700条目 pk2 ..(10-12列)

表2-850条目 pk3
..(7-8列)

索引不是神奇药丸

当然,它们可以加快查询速度,但也会降低写入速度(插入/更新/删除)并占用宝贵的RAM


仔细使用它们。

我认为对所有四列进行索引并不能真正提高性能,因为您仍然需要进行完整的索引扫描,而最终的结果与完整的表扫描基本相同。索引只是表中数据的重复。可以粘贴查询吗?

向列添加索引意味着数据库在每次写入时都要做更多的工作,但在某些读取时可以节省时间

如果您的查询花费了很长时间,那么为联接添加覆盖索引可以大大加快速度,但与所有优化工作一样,请确保您有合适的指标与“优化”前后进行比较


但是,由于您是按列加入表,因此不需要索引,因为您已经具有主键,而且无论如何都需要进行整行读取。

在引用表列中,必须有一个索引,其中外键列按相同顺序列为第一列

如果引用表不存在,则会自动在引用表上创建这样的索引


阅读下面的文章以了解batter:

如果您将主表的主键添加到其他表中并连接此字段上的表,则无需添加索引。

MySQL允许几种类型的索引,如主键索引、唯一索引、普通索引(也称为“非唯一索引”),普通索引,无约束索引)和全文索引。当然,这些索引极大地提高了选择查询的速度。但是,它们也有一些相当大的缺点。 MySQL索引的优势

一般来说,MySQL索引到数据库有三个优点:

Query optimization: Indexes make search queries much faster.
Uniqueness: Indexes like primary key index and unique index help to avoid duplicate row data.
Text searching: Full-text indexes in MySQL version 3.23.23, users have the opportunity to optimize searching against even large amounts of text located in any field indexed as such.

创建索引需要额外的磁盘空间,而且索引过多可能会导致文件系统大小限制引起的问题,因此必须仔细考虑选择要索引的正确字段

由于索引仅用于加速搜索记录中的匹配字段,因此,在执行插入或删除操作时,仅用于输出的索引字段只会浪费磁盘空间和处理时间,因此应避免。此外,考虑到二进制搜索的性质,基数或数据的唯一性很重要。对基数为2的字段进行索引会将数据一分为二,而基数为1000的字段将返回大约1000条记录。基数如此低,效率会降低为线性排序,如果基数大于30%,查询优化器将避免使用索引对记录编号的修改,有效地使索引浪费了空间


所以最好在列组上添加索引。

要正确索引数据以提高性能,您需要了解数据。假设我正在创建一个普查数据库表:

CREATE TABLE CENSUS
(
    ID INTEGER NOT NULL,
    GENDER CHAR(1) NOT NULL,
    FAVOURITEFOOD NVARCHAR(20) NOT NULL,
    STATE NVARCHAR(20) NOT NULL
);
由于处理数据,我可能知道:

  • 男女比例为50%男性,50%女性
  • 60%喜欢烤肉,20%是素食者,20%喜欢亚洲食物,20%喜欢意大利面
  • 加州25%,纽约25%,其余各州1%
如果我想寻找喜欢烘焙和居住在加利福尼亚的男性,我会考虑把多栏索引放在第一位(州,性别,最喜欢的食物)。.I将FavoriteFood设置为索引中的最后一列。这是因为状态筛选器将数据切碎25%,而FavoriteFood将返回数据库的大部分(不比完整表扫描更好)

如果我想寻找喜欢素食和生活在纽约的女性,我会考虑制作一个多栏索引,并把最喜欢的食物放在首位(喜欢的食物,状态,性别)。在这里,最喜欢的食物把数据砍了20%,所以比其他两个栏目要好得多。 如果我经常运行这两个查询,我应该建立哪个索引?答案是两个:

CREATE INDEX IX_CENSUS_001 ON CENSUS (STATE, GENDER, FAVOURITEFOOD);
CREATE INDEX IX_CENSUS_002 ON CENSUS (FAVOURITEFOOD, STATE, GENDER);
ANALYZE TABLE CENSUS;
该命令存储表的键分布。现在,当您运行任一查询时,它将确定IX_CENSUS_001还是IX_CENSUS_002是执行计划的最佳索引

如果希望开始运行不同类型的查询,我将停止并再次思考我的数据。我可能需要添加新索引,并且可能需要再次运行ANALYZE TABLE


因此,回到您的场景;这取决于您表中的数据以及您希望对其执行的查询。

事实上,如果不知道更多关于它们引用的表的大小、基数和表之间的关系,就不可能说哪些列应该被索引,在什么组合中。什么您的表正在使用的引擎?您使用外键吗?@piotrekkr:我使用的是MyISAM引擎。没有外键。所有其他3个表都有数千个数据,并且数据会一天一天地增长。为什么不为您当前加入的列编制索引呢?那么就说
t1 JOIN t2 on t1.id=t2.id