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

时间:2016-10-11 22:06:45

标签: php mysql apache

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

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

All tables indexing are like this example. All columns as indexes

3 个答案:

答案 0 :(得分:2)

不,您不会为所有列编制索引。您可以为WHERE子句中专门涉及的列编制索引,有时如果它们涉及ORDER BY

在这种情况下,您需要type上的索引:

SELECT name FROM users WHERE type='admin'

在这种情况下,您需要active,type上的索引:

SELECT name FROM users WHERE type='admin' AND active=1

在这种情况下,您可能需要active,type,name上的索引:

SELECT name FROM users WHERE type-='admin' AND active=1 ORDER BY name LIMIT 10

您添加的索引越多,写入速度就越慢,但读取速度会越快。这是一个经典的权衡。仔细评估您需要哪些索引,并仅在有实际利益的情况下应用它们。不要打他们,因为你觉得他们应该在那里。

在超小型桌子上,那些<1000行,索引的表格不会有太大帮助,因为桌面扫描不会花那么长时间。在任何不平凡的事情上,他们都是绝对必要的。

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

不,您不应该索引所有列。写数据时速度会慢一些。你的CPU有时达到200%是不正常的。我建议你检查你的SQL。

我确信优化SELECT语句很有帮助。

http://dev.mysql.com/doc/refman/5.6/en/statement-optimization.html

1.使用缓存优化您的查询。尝试使用参数而不是函数。

(感谢@ tadman的建议)

     id       |    Year    |   Groups    
      2       |     2001   |     B
      3       |     2001   |     A

2.EXPLAIN你明智地选择。它可以帮助您找到潜在的性能问题。

// no cache
$sql = "SELECT username FROM user WHERE signup_date >= CURDATE()";

// cache
$today = date("Y-m-d");
$sql = "SELECT username FROM user WHERE signup_date >= '$today'"); 

3。当您只需要第一行结果时,请使用“LIMIT N”。

EXPLAIN select name,phone from user where name="JakLiao";

4。在where子句中需要时使用索引。

SELECT * FROM user WHERE country = 'China' limit 1;

5。在连接表时使用索引。

//row "name" should add index.
select * from user where name LIKE 'Jak%' limit 10;

6。避免“选择*”

select company_name FROM users LEFT JOIN companies ON (users.state = companies.state) WHERE users.id = 123;

7。 PROCEDURE ANALYZE(),MYSQL将帮助您分析数据库和数据。 8.当你想知道表的行时,COUNT(1)。

//not suggest
SELECT * FROM user WHERE user_id = 1;
//suggest
SELECT username FROM user WHERE user_id = 1;