Som*_*luk 5 mysql indexing performance search-engine
我想制作一个包含4列的表.一个是主键,其他三个列是对其他表的列的引用.我想用它来连接这四个表来制作搜索过滤器.这些联接需要时间.
我在想我应该索引这些列,因为我读到在连接条件中使用的列上添加索引[使它们运行得更快].我的问题是,如果表的所有列都被编入索引会有问题吗?或者还有其他方法可以降低搜索过滤器的时间复杂度.提前致谢.
更多提示:表1(主要搜索)-1000个条目primary_key fk1 fk2 fk3
表2-800条目pk1 ..(8-9列)
表3-700条目pk2 ..(10-12列)
表2-850条目pk3 ..(7-8列)
Avi*_*ash 10
创建索引需要额外的磁盘空间,并且太多索引可能导致文件系统大小限制引起的问题,必须仔细考虑选择要索引的正确字段.
由于索引仅用于加速在记录中搜索匹配字段,因此,仅用于输出的索引字段仅仅是在执行插入或删除操作时浪费磁盘空间和处理时间,因此应该避免.同样考虑到二进制搜索的性质,数据的基数或唯一性很重要.对基数为2的字段进行索引会将数据分成两半,而基数为1,000则会返回大约1,000条记录.如此低的基数,有效性会降低到线性排序,如果基数大于记录数的30%,查询优化器将避免使用索引,从而有效地使索引浪费空间.
因此,最好在列组上添加索引.
为了正确索引您的数据以提高性能,您需要了解您的数据。假设我正在创建一个人口普查数据库表:
CREATE TABLE CENSUS
(
ID INTEGER NOT NULL,
GENDER CHAR(1) NOT NULL,
FAVOURITEFOOD NVARCHAR(20) NOT NULL,
STATE NVARCHAR(20) NOT NULL
);
Run Code Online (Sandbox Code Playgroud)
由于处理数据,我可能知道:
如果我想搜索喜欢烤肉并且住在加利福尼亚的男性,我会考虑制作多列索引,将 STATE 放在首位(STATE、GENDER、FAVOURITEFOOD)。我将 FAVOURITEFOOD 作为索引中的最后一列。这是因为 STATE 过滤器会将数据砍掉 25%,而 FAVOURITEFOOD 将返回大部分数据库(不比全表扫描好)。
如果我想搜索喜欢素食并住在纽约的女性,我会考虑做一个多列索引并将 FAVOURITEFOOD 放在首位(FAVOURITEFOOD, STATE, GENDER)。在这里,FAVOURITEFOOD 将数据削减了 20%,因此它是比其他两列更好的选择。
如果我经常运行 BOTH 查询,我应该创建哪个索引?答案是两者:
CREATE INDEX IX_CENSUS_001 ON CENSUS (STATE, GENDER, FAVOURITEFOOD);
CREATE INDEX IX_CENSUS_002 ON CENSUS (FAVOURITEFOOD, STATE, GENDER);
ANALYZE TABLE CENSUS;
Run Code Online (Sandbox Code Playgroud)
该ANALYZE TABLE命令存储表的密钥分发。现在,当您运行任一查询时,它将确定 IX_CENSUS_001 还是 IX_CENSUS_002 是执行计划的最佳索引。
如果,我希望开始运行不同类型的查询,我会停下来再次考虑我的数据。我可能需要添加一个新索引,并且可能需要再次运行 ANALYZE TABLE。
所以,回到你的场景;这取决于您在表中拥有的数据以及您希望对其执行的查询。