This slide is based on 刘增杰、张少军 《MySQL 5.5 从零开始学》
优化 MySQL 数据库是数据库管理员(DBA)和数据库开发人员的必备技能.
MySQL 数据库优化是多方面的, 原则是
例如:
在 MySQL 中, 可以使用
原则: 符合某种范式.
另一方面, 结合实际情况, 即根据字段(属性)的使用频率来分解. 一般的, 将字段很多的表分解成多个表. 特别的, 如果有些字段使用频率很低, 可以将这些字段分离出来形成新的表.
对于需要经常联合查询的表, 可以建立中间表以提高查询效率. 将需要经常联合查询的数据插入到中间表中, 然后将原来的联合查询改为对中间表的查询. 这里的中间表可以使用视图.
一般的, 冗余字段在范式中是不被建议的. 但是数据库的运行需要考虑实际情况, 有时合理地加入一些特定的冗余字段可以提高查询速度.
原因在于, 表的规范化程度越高, 表与表之间的联系也就越多, 从而需要联合查询的情况也越多.
冗余字段的问题
是否通过增加冗余来提高数据库性能, 这要根据实际需求综合分析.
影响插入速度的因素主要有
根据这些情况, 可以分别进行优化.
对于非空表, 插入记录时, MySQL 会根据表的索引对插入的记录建立索引. 如果插入大量数据, 建立索引会降低插入记录的速度.
禁用索引
ALTER TABLE table_name DISABLE KEYS;
启用索引
ALTER TABLE table_name ENABLE KEYS;
对于空表批量导入数据, 则不需要进行禁止索引操作. 因为 MyISAM 引擎的表是在导入数据之后才建立索引的.
SET UNIQUE_CHECKS=0;
插入完毕后开启唯一性检查
SET UNIQUE_CHECKS=1;
禁止自动提交
SET AUTOCOMMIT=0;
恢复自动提交
SET AUTOCOMMIT=1;
MySQL 提供了分析表、检查表和优化表的语句.
语法:
ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name[, tbl_name2, ...];
使用
在分析期间, 只能读取表中的记录, 不能更新和插入记录.
作为例子, 我们分析 test_bar 数据库中的表 Bars.
mysql> use test_bar; Database changed mysql> show tables; +--------------------+ | Tables_in_test_bar | +--------------------+ | bars | | beers | | drinkers | | frequents | | likes | | sells | +--------------------+ 6 rows in set (0.01 sec) mysql> ANALYZE TABLE bars; +---------------+---------+----------+----------+ | Table | Op | Msg_type | Msg_text | +---------------+---------+----------+----------+ | test_bar.bars | analyze | status | OK | +---------------+---------+----------+----------+ 1 row in set (0.02 sec)
MySQL 中可以使用
语法:
CHECK TABLE tbl_name [, tbl_name2 [, tbl_name3 ...]] [QUICK | FAST | MEDIUM | EXTENDED | CHANGED]
注意, 这些选项只对
mysql> CHECK TABLE bars; +---------------+-------+----------+----------+ | Table | Op | Msg_type | Msg_text | +---------------+-------+----------+----------+ | test_bar.bars | check | status | OK | +---------------+-------+----------+----------+ 1 row in set (0.00 sec)
MySQL 中可以使用
但是
OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name2 [...]]
mysql> OPTIMIZE TABLE bars; +---------------+----------+----------+-------------------------------------------------------------------+ | Table | Op | Msg_type | Msg_text | +---------------+----------+----------+-------------------------------------------------------------------+ | test_bar.bars | optimize | note | Table does not support optimize, doing recreate + analyze instead | | test_bar.bars | optimize | status | OK | +---------------+----------+----------+-------------------------------------------------------------------+ 2 rows in set (0.10 sec) mysql> desc bars; +---------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------+--------------+------+-----+---------+-------+ | name | varchar(20) | NO | PRI | NULL | | | addr | varchar(255) | YES | | NULL | | | license | varchar(255) | YES | | NULL | | +---------+--------------+------+-----+---------+-------+ 3 rows in set (0.01 sec)
以下参考自: https://blog.csdn.net/langkeziju/article/details/44977017
从两个方面来优化 MySQL 服务器:
服务器的硬件性能直接决定着 MySQL 数据库的性能.
MySQL 服务的配置参数都在