服务器学习心得


优化数据库结构

<ul> <li>合理的数据库结构占用更小磁盘空间,让查询速度更快。</li> <li>数据库结构是否合理,需要考虑是否存在冗余、对表的查询和更新的速度、表中字段的数据类型是否合理等多方面的内容。</li> </ul> <h2>分解表</h2> <ul> <li>有些表在设计时设置了很多的字段,而有些字段的使用频率非常低。</li> <li>这样当这个表的数据量很大时,查询数据的速度就会很慢。下面介绍优化这种表的方法。</li> <li>对于这种情况,我们可以将这些使用频率较低的字段分离出来形成新表</li> </ul> <h2>增加中间表</h2> <ul> <li>表连接会降低数据库的查询速度,所以对于经常使用表连接查询的表,建立中间表来提高查询速度。</li> <li>首先分析经常需要同时查询哪几个表中的哪些字段,然后将这些字段建立一个中间表,并将原来那几个表的数据插入到中间表中,之后就可以使用中间表来进行查询和统计了。</li> </ul> <h2>增加冗余字段</h2> <ul> <li>设计数据库时,尽量让表符合三大范式。</li> <li>为提高查询速度,可有意识在表中增加冗余字段。</li> <li>表规范化程度越高,表与表之间关系就越多。 <ul> <li>查询时,需要在多个表之间进行连接查询,而连接操作会降低查询速度。</li> </ul></li> </ul> <h2>技巧</h2> <ul> <li> <p>分解表、增加中间表和增加冗余字段都浪费了一定的磁盘空间。</p> </li> <li> <p>从数据库性能的角度,增加少量的冗余,来提高数据库查询速度是可以接受的。</p> <ul> <li>是否通过增加冗余来提高数据库性能,=要根据 MySQL 服务器的具体要求来定。</li> <li>如果磁盘空间很大,可以考虑牺牲一点磁盘空间。</li> </ul> </li> </ul> <h2>如何定位效率低下的SQL</h2> <h4>使用 SHOW STATUS 命令</h4> <pre><code class="language-mysql">SHOW STATUS LIKE 'value';</code></pre> <p>其中,value 参数是常用的几个统计参数,常用参数介绍如下:</p> <ul> <li>Connections:连接 MySQL 服务器的次数;</li> <li>Uptime:MySQL 服务器的上线时间;</li> <li>Slow_queries:慢查询的次数;</li> <li>Com_select:查询操作的次数;</li> <li>Com_insert:插入操作的次数,对于批量插入操作,只累加一次;</li> <li>Com_update:更新操作的次数;</li> <li>Com_delete:删除操作的次数。</li> </ul> <p>以上参数针对于所有存储引擎的表,下面几个参数只针对 InnoDB 存储引擎。</p> <ul> <li>Innodb_rows_read:表示 SELECT 语句查询的记录数;</li> <li>Innodb_rows_inserted:表示 INSERT 语句插入的记录数;</li> <li>Innodb_rows_updated:表示 UPDATE 语句更新的记录数;</li> <li>Innodb_rows_deleted:表示 DELETE 语句删除的记录数。</li> </ul> <p>需要查询 MySQL 服务器的连接次</p> <pre><code class="language-mysql">SHOW STATUS LIKE 'Connections';</code></pre> <h4>使用慢查询日志</h4> <ul> <li>1)开启慢查询日志 , 配置样例</li> </ul> <pre><code class="language-mysql">[mysqld] log-slow-queries</code></pre> <ul> <li>在配置文件中增加上述配置项并重启 MySQL 服务,这时 MySQL 慢查询功能生效。</li> <li>2)查询 long_query_time 的值 。</li> </ul> <pre><code class="language-mysql">SHOW VARIABLES LIKE 'long%';</code></pre> <ul> <li>3)这里为了方便测试,将修改慢查询时间为 5 秒。</li> </ul> <pre><code class="language-mysql">SET long_query_time=5;</code></pre> <ul> <li>4)依次执行下面两个查询语句。</li> </ul> <pre><code class="language-mysql"># 以下查询时间低于 5 秒不会出现在慢查询日志中 SELECT COUNT(*) FROM student; # 以下查询时间大于 5 秒,应该出现在慢查询日志中 SELECT COUNT(*) FROM t_user;</code></pre> <ul> <li>5)查看慢查询日志,内容如下:</li> </ul> <pre><code class="language-mysql"># Time: 081026 19:46:34 # User@Host: root[root] @ localhost [] # Query_time: 11 Lock_time: 0 Rows_sent: 1 Rows_examined: 6552961 select count(*) from t_user;</code></pre>

页面列表

ITEM_HTML