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