MysqL 的优化
发布时间:2023-09-21 10:26:11 所属栏目:MySql教程 来源:
导读:MysqL 的优化主要指 sql 语句的优化和 MysqL Server 的优化,相对来说,sql 优化相对更为重要,也更考验功力。本小节将讲解 sql 语句优化的一般思路,以及相应方法。
1. sql优化的一般步骤
当碰到一个存在性能问
1. sql优化的一般步骤
当碰到一个存在性能问
MysqL 的优化主要指 sql 语句的优化和 MysqL Server 的优化,相对来说,sql 优化相对更为重要,也更考验功力。本小节将讲解 sql 语句优化的一般思路,以及相应方法。 1. sql优化的一般步骤 当碰到一个存在性能问题的 MysqL 数据库时,一般按照如下步骤进行分析解决: 定位问题 sql; 分析 sql 执行计划; 分析 sql Profile; 实施优化措施。 2. 定位问题sql 定位 MysqL 的问题 sql,主要有两种方法,查看当前线程(show processlist)和慢日志。一般来说,当前发生的问题用到 show processlit,事后分析用到慢日志。 2.1 查看当前线程 通过 show processlist 命令查看当前正在执行的sql语句,包括执行状态,是否锁表,执行时长等。 MysqL> show processlist\G *************************** . row *************************** Id: User: root Host: localhost : tempdb Command: Query Time: State: starting Info: show processlist *************************** . row *************************** Id: User: root Host: localhost : tempdb Command: Query Time: State: starting Info: select * from customer where balance=; rows in set ( sec) 有时 sql 语句比较复杂,而且执行量较大,通过 show processlist 来查看不太方便,这时可以通过表information_schema.processlist 进行查看,还可以自定义查询方式。 MysqL> select * from information_schema.processlist order by info desc\G *************************** . row *************************** ID: USER: root HOST: localhost DB: tempdb COMMAND: Query TIME: STATE: executing INFO: select * from information_schema.processlist order by info desc *************************** . row *************************** ID: USER: root HOST: localhost DB: tempdb COMMAND: Sleep TIME: STATE: INFO: NULL rows in set ( sec) 2.2 慢日志 通过分析慢日志定位存储性能问题的 sql,慢日志有一个阈值参数 long_query_time,单位是秒,比如该参数设置为 1,那么执行时长超过 1 秒的 sql 都会被记录到慢日志文件: 想要快速分析慢日志的 sql,建议使用 percona 公司的慢日志分析工具 pt-query-digest。 3. 分析 sql 执行计划 找到问题 sql 后,通过 explain 命令查看执行计划: MysqL> explain select * from customer where balance=\G *************************** . row *************************** id: select_type: SIMPLE table: customer partitions: NULL type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: Extra: Using where row in set, warning ( sec) 其中 select_type 表示 select 类型,一般值为 simple、primary、union、subquery。type 表示访问类型,常见值有(性能由差到好):ALL、index、range、ref、eq_ref、const: type 等于 ALL,表示全表扫描,需要遍历全表所有的数据; type 等于 index,表示索引全扫描,需要遍历整个索引来查找需要的数据; type 等于 range,表示索引范围扫描,扫描索引部分数据即可查找需要的数据,常见操作有大于、小于、between; type 等于 ref,使用唯一或非唯一索引的前缀扫描,返回查找到的单独值; type 等于 eq_ref,使用唯一索引,且仅有一条记录匹配; type 等于 const,表中仅有一行数据是匹配的。 4. 分析 sql Profile 想要进一步分析 sql,可以通过 show profiles 命令: MysqL> select * from customer where balance=; MysqL> show profiles; +----------+------------+-----------------------------------------+ | Query_ID | Duration | Query | +----------+------------+-----------------------------------------+ | | | select @@profiling | | | | SELECT DATABASE() | | | | select * from customer where balance= | +----------+------------+-----------------------------------------+ rows in set, warning ( sec) MysqL> show profile for query ; +----------------------+----------+ | Status | Duration | +----------------------+----------+ | starting | | | checking permissions | | | opening tables | | | init | | | System lock | | | optimizing | | | statistics | | | preparing | | | executing | | | Sending data | | | end | | | query end | | | closing tables | | | freeing items | | | cleaning up | | +----------------------+----------+ rows in set, warning ( sec) show profile for query 可以看出这条 sql 执行过程中的步骤和相应消耗时间,从执行结果可以看到,Sending data 这个状态是耗时最长的。 5. 实施优化措施 我们找到问题 sql,并分析原因后,就得采取相应措施进行优化,以提高 sql 语句的执行效率。 在分析 sql 执行计划这一小节的例子中,我们可以看到执行计划是 type 等于 ALL,表示需要对表customer 进行全表扫描才能找到相应数据,这时我们要对字段 balance 增加索引。 MysqL> alter table customer add index idx_balance(balance); Query OK, rows affected ( sec) Records: Duplicates: Warnings: MysqL> explain select * from customer where balance=\G *************************** . row *************************** id: select_type: SIMPLE table: customer partitions: NULL type: ref possible_keys: idx_balance key: idx_balance key_len: ref: const rows: Extra: NULL row in set, warning ( sec) 从执行计划,可以看出,扫描行数从20965行减少至10行,查找效率可以大大提升。 (编辑:汽车网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |