超大表的索引 - 有关性能的基础信息

Posted

技术标签:

【中文标题】超大表的索引 - 有关性能的基础信息【英文标题】:Indexing of very large Table - Base information on performance 【发布时间】:2014-03-14 13:53:42 【问题描述】:

我有一个包含 30.000.000 行的表,并且存在严重的性能问题。一开始 - 当我不知道会有多少行时 - 我只在两个至少 23 个字段上创建了一个索引。这两个字段是 varchar 类型。其中 20 个字段为 varchar 和 text 类型,其中 3 个为 int 类型。

我的第一个问题

如何才能真正提高数据库的整体性能?找到了很多技巧,但没有一个真正奏效。性能不佳会导致以下问题:

1) 我是否可以创建更多索引,也不能将 30.000.000 行复制到一个为所有字段创建索引的空表中(如果我尝试其中一个,则需要很多小时才能中断查询并什么都没有发生)

2) 前端单次搜索的性能很慢。如果有更多的客户端同时连接,它们会等待很长时间,只是为了在最后获得超时。

一些代码:

"SELECT *, MATCH(item_query) AGAINST ('\"".$query."\"' IN BOOLEAN MODE) AS score 
 FROM items 
 WHERE MATCH(item_query) AGAINST ('\"".$query."\"' IN BOOLEAN MODE) AND item_address LIKE '%".$where."%' AND item_type = '".$what."' AND item_language = '".$_SESSION['language']."' AND item_country = '".$_SESSION['country']."' ORDER BY score DESC"

当用户在前端键入搜索查询时使用此语句。 item_query id 被索引,其他字段(还没有)。

我什至创建了一个脚本,它应该读取 1000 个数据集,将其写入新的完整索引表中,然后不断地执行此操作,直到没有更多数据出现。但是没有成功...脚本在我收到 500 服务器错误前 10 分钟挂起。

当我使用 GUI (SqlYog) 查看数据并将结果限制为 1000 甚至 5000 行时,它运行良好 - 需要一点时间,但运行良好。所以桌子似乎没问题。

我的第二个问题

一旦我找到了索引问题的任何解决方案,我该如何改进上面看到的sql语句???

提前感谢您的任何想法,

最好的问候,英格玛

【问题讨论】:

您已将此问题标记为“mysql”和“SQL Server”。它是哪一个?什么版本? 对不起,MySql 5.x 据我所知(我认为是 5.5 或 5.6) 我在一年前用 apt-get 在 debian 上安装了它,这就是为什么我现在不知道的原因。如果您想确切知道,我必须连接到服务器。表是 MyISAM... 在本地计算机上运行,​​而不是在远程计算机上运行? 不相关,但使用 mysqli 或 PDO 准备好的语句而不是连接字符串。 【参考方案1】:

当我使用 GUI (SqlYog) 查看数据并将结果限制为 1000 甚至 5000 行,完美运行 - 需要一点时间,但有效 好的。所以桌子似乎没问题。

使用CHECK TABLE table-name 检查表是否存在问题。请先阅读the docs。

性能的一个经验法则是索引 WHERE 子句中使用的每一列。所以你至少要索引“item_type”、“item_language”和“item_country”。我假设全文列“item_query”已经有全文索引; “item_address”的通配符标准不能使用索引。复合索引可能有用。

要隔离问题,请尝试删除“item_address”的条件。还要学习使用和解释MySQL's EXPLAIN。

我在这里有一个包含 3000 万行的表。在 varchar(35) 列上创建索引大约需要 10 分钟。我的电脑没什么特别的。

如果您要将数据加载到新表中,您最好创建一个没有索引、没有主键、没有外键的表;然后加载数据;最后创建索引、主键和外键。

您也可以尝试dumping the database 并将其重新加载到另一台计算机上。 (或同一台计算机,如有必要。)

【讨论】:

嗨,迈克,您认为在所有其他字段上使用 MATCH AGAINST 是否有意义? 如果您知道要搜索的值,则不会。

以上是关于超大表的索引 - 有关性能的基础信息的主要内容,如果未能解决你的问题,请参考以下文章

Oracle-创建索引分区

夯实Mysql基础MySQL性能优化的21个最佳实践 和 mysql使用索引

将 MySQL 索引添加到大表的性能影响

id索引更改怎么重新抽取索引内容

SQLServer之创建唯一聚集索引

OracleOracle索引