索引mysql数据库中的所有列是否正确?

Fab*_*son 4 php mysql apache

我的站点加载内容的时间太长,mysql 服务使用的 CPU 负载有时达到 200%。检查表发现表的所有列都用作索引。这是对的?它会影响性能吗?

我的服务器配置:16GB RAM,3.4GHz 大多数表大约有 25k ~ 50k 行。和 10~20 列。

所有表索引都像这个例子。所有列作为索引

tad*_*man 7

不,您不会索引所有列。您可以索引专门包含在WHERE子句中的列,有时如果它们包含在ORDER BY.

在这种情况下,您需要一个索引type

SELECT name FROM users WHERE type='admin'
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您需要一个索引active,type

SELECT name FROM users WHERE type='admin' AND active=1
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您可能需要一个索引active,type,name

SELECT name FROM users WHERE type-='admin' AND active=1 ORDER BY name LIMIT 10
Run Code Online (Sandbox Code Playgroud)

添加的索引越多,写入速度越慢,但读取速度越快。这是一个经典的权衡。仔细评估您需要哪些索引,并仅在有实际收益时才应用它们。不要只是因为你觉得他们应该在那里而扇他们耳光。

在超小表上,那些行数小于 1000 的表,索引不会有太大帮助,因为表扫描不会花费那么长时间。在任何重要的事情上,它们都是绝对必要的。

如果您遇到性能问题,我建议您的架构是最大的障碍,而不是缺少索引。

  • ...加上外键和连接谓词中的列,有时可以使用索引来满足 GROUP BY(EXPLAIN 输出中的“对 group by 使用索引”)。对于某些查询,“覆盖索引”比其他索引更有利。+10。在繁忙的系统上要考虑的另一个重要问题是争用锁。(存储引擎的选择会影响性能。) (2认同)

Emi*_*lay 0

对所有列建立索引不正确。它会影响写操作的性能。每个附加索引在写入操作后都需要额外的时间来更新。此外,每个索引都会花费额外的空间。您应该仅对将用于搜索的列建立索引。