服务器学习心得


优化插入数据速度

<ul> <li>向数据表插入数据时,索引、唯一性检查、数据大小是影响插入速度的主要因素。</li> </ul> <h2>MyISAM 引擎表,常见优化方法</h2> <h4>1. 禁用索引</h4> <ul> <li> <p>对非空表插入数据时,会根据表的索引对插入记录进行排序。</p> </li> <li> <p>插入大量数据时,这些排序会降低插入数据的速度。</p> </li> <li> <p>为了解决这种情况,可在插入数据之前先禁用索引,等数据插入完毕后,再开启索引。</p> </li> <li>禁用索引</li> </ul> <pre><code class="language-mysql">ALTER TABLE table_name DISABLE KEYS;</code></pre> <ul> <li>重新开启索引</li> </ul> <pre><code class="language-mysql">ALTER TABLE table_name ENABLE KEYS;</code></pre> <ul> <li>新创建的表,可以先不创建索引,等到数据都导入后,再创建索引,这样可以提高导入数据的速度。</li> </ul> <h4>2. 禁用唯一性检查</h4> <ul> <li>插入数据时,会对插入的数据进行唯一性检查,会降低插入数据的速度。</li> <li> <p>可在插入数据前禁用唯一性检查,等到插入数据完毕后再开启。</p> </li> <li>禁用唯一性检查</li> </ul> <pre><code class="language-mysql">SET UNIQUE_CHECKS=0;</code></pre> <ul> <li>开启唯一性检查</li> </ul> <pre><code class="language-mysql">SET UNIQUE_CHECKS=1;</code></pre> <h4>3. 使用批量插入</h4> <ul> <li>插入多条数据方式 <ul> <li>使用一个 INSERT 语句插入多条数据</li> <li>一个 INSERT 语句插入一条数据,执行多个 INSERT 来插入多条数据</li> </ul></li> </ul> <p>使用一个 INSERT 语句插入多条数据</p> <pre><code class="language-mysql">INSERT INTO items (name,city,price,number,picture) VALUES ('耐克运动鞋','广州',500,1000,'001.jpg'), ('耐克运动鞋2','广州2',500,1000,'002.jpg');</code></pre> <ul> <li>一个 INSERT 语句只插入一条数据,执行多个 INSERT 语句来插入多条数据</li> </ul> <pre><code class="language-mysql">INSERT INTO items(name,city,price,number,picture) VALUES('耐克运动鞋','广州',500,1000,'001.jpg'); INSERT INTO items(name,city,price,number,picture) VALUES('耐克运动鞋2','广州',500,1000,'002.jpg');</code></pre> <ul> <li> <h5>总结</h5> <ul> <li>一次性插入多条数据和多次插入数据所耗费的时间不一样。</li> <li>第一种方式,减少了与数据库之间的连接等操作,速度比第二种方式要快一些。</li> <li>插入大量数据时,建议使用此种方法。</li> <li>如果能用 LOAD DATA INFILE 语句,就尽量用 LOAD DATA INFILE 语句。</li> <li>因为 LOAD DATA INFILE 语句导入数据的速度比 INSERT 语句的速度快。</li> </ul> </li> </ul> <h2>InnoDB 引擎的表,常见的优化方法</h2> <h4>1. 禁用唯一性检查</h4> <ul> <li>同 MyISAM 引擎相同,插入数据之前,先禁用索引,等数据都插入完毕后在开启索引。</li> </ul> <h4>2. 禁用外键检查</h4> <ul> <li>使用外键时,在子表中插入一条数据,首先会检查主表中是否有相应的主键值,然后锁定主表的记录,在插入值。</li> <li>相比较,使用外键多了2步操作,速度会慢一些。</li> <li>在插入数据之前禁止对外键检查,数据插入完成之后,再恢复对外键的检查。 <ul> <li>不是对于数据完整性要求较高的系统不建议使用。</li> </ul></li> <li>禁用外键检查</li> </ul> <pre><code class="language-mysql">SET FOREIGN_KEY_CHECKS=0; </code></pre> <ul> <li>恢复对外键检查</li> </ul> <pre><code class="language-mysql">SET FOREIGN_KEY_CHECKS=1;</code></pre> <h4>3. 禁止自动提交</h4> <ul> <li>MySQL 的事务自动提交模式,是默认开启的,对性能有一定影响。 <ul> <li>插入了 1000 条数据,就会提交 1000 次,大大影响插入数据的速度。</li> <li>如果自动提交关掉,通过程序来控制,只要一次提交就可以。</li> </ul></li> <li> <p>在插入数据之前,可以先禁止事务的自动提交,等数据导入完成之后,再恢复自动提交操作。</p> </li> <li>禁止自动提交</li> </ul> <pre><code class="language-mysql">SET AUTOCOMMIT=0; </code></pre> <ul> <li>恢复自动提交</li> </ul> <pre><code class="language-mysql">SET AUTOCOMMIT=1;</code></pre>

页面列表

ITEM_HTML