一、优化数据库的一般步骤:
(A) 通过 show status 命令了解各种SQL的执行频率。
(B) 定位执行效率较低的SQL语句,方法两种:
事后查询定位:慢查询日志:--log-slow-queries=[file_name],
事中查询状态:show processlist命令查看当前进行的线程,包括锁表情况
(C) 通过EXPLAIN 或 DESC 分析低效SQL的执行计划
(D) 确定问题并采取优化措施
二、索引问题
(A) MyISAM存储引擎的表的数据和索引是自动分开存储的,各自独立的一个文件;InnoDB存储引擎的表的数据和索引在一个表空间里,但可以有多个文件组成。
(B) MySQL中索引的存储类型目前只有BTREE和HASH两种,具体和表引擎有关。支持前缀索引。
(C) 对于多列索引,最左前缀的成立条件要注意,必须是最左边的列。
(D) like查询,是常量且通配符不是第一个字符时,才能使用索引。
(E) 对大文件进行搜索,建议采用全文索引,
(F) 如果列名是索引,使用 column_name is null 将使用索引。
(G) or分割的条件中,如果不是两个都有索引,就不会使用索引。
(H) 如果列类型是字符串,一定记得把字符串常量值用引号括起来,否则不使用索引。
三、查看索引使用情况
如果索引有效,Handler_read_key的值将很高,代表了一个行被索引值读的次数,
Handler_read_rnd_next 表示数据文件读下一行的请求数,值高意味着查询运行低效。
四、两个简单实用的优化方法
(A) 定期分析表和检查表
五、常见SQL的优化
(A) 大批量插入数据,
通过控制索引的开启和关闭来提升速度。
控制导入数据的排列顺序来提升速度。
通过开启和关闭唯一性校验来提升速度。
通过开启和关闭自动提交属性来提升速度。
(B) 通过 order by null 消除排序的时间消耗
(C) 优化嵌套查询:连接查询比子查询更有效率:子查询需要在内存中建立临时表。
(D) or 条件的每个条件列都必须有索引,才使用索引。
(E) 使用SQL提示,