MySQL優化的步驟詳解

? ? ? ?在開發過程中,雖然感覺優化sql語句很重要,但是往往更加重視的是功能實現,為了使自己以后寫mysql語句效率更高,有必要對mysql優化做一個小小歸納。

步驟一、通過show status 命令了解各種sql執行的效率

show [session|gobal] status

session級別表示統計當前連接的結果。

global級別表示統計自數據上次啟動至今的結果。

如果不寫級別,默認的是session級別

eg:SHOW GLOBAL STATUS;

Variable_name Value
Aborted_clients 6
Aborted_connects 0
Binlog_cache_disk_use 0
Binlog_cache_use 0
Binlog_stmt_cache_disk_use 0
Binlog_stmt_cache_use 0
Bytes_received 95645
Bytes_sent 1285066
Com_admin_commands 0
Com_assign_to_keycache 0
Com_alter_db 0
Com_alter_db_upgrade 0
Com_alter_event 0
Com_alter_function 0
Com_alter_procedure 0
Com_alter_server 0
Com_alter_table 6
Com_alter_tablespace 0
Com_alter_user 0
Com_analyze 0
Com_begin 0
Com_binlog 0
Com_call_procedure 0
Com_change_db 8
Com_change_master 0
Com_check 0
Com_checksum 0
Com_commit 0
Com_create_db 0
Com_create_event 0
Com_create_function 0
Com_create_index 0
Com_create_procedure 0
Com_create_server 0
Com_create_table 5
Com_create_trigger 0
Com_create_udf 0
Com_create_user 0
Com_create_view 6
Com_dealloc_sql 0
Com_delete 2
Com_delete_multi 0
Com_do 0
Com_drop_db 0
Com_drop_event 0
Com_drop_function 0
Com_drop_index 0
Com_drop_procedure 0
Com_drop_server 0
Com_drop_table 0
Com_drop_trigger 0
Com_drop_user 0
Com_drop_view 1
Com_empty_query 2
Com_execute_sql 0
Com_flush 0
Com_get_diagnostics 0
Com_grant 0
Com_ha_close 0
Com_ha_open 0
Com_ha_read 0
Com_help 0
Com_insert 15
Com_insert_select 0
Com_install_plugin 0
Com_kill 0
Com_load 0
Com_lock_tables 0
Com_optimize 0
Com_preload_keys 0
Com_prepare_sql 0
Com_purge 0
Com_purge_before_date 0
Com_release_savepoint 0
Com_rename_table 0
Com_rename_user 0
Com_repair 0
Com_replace 0
Com_replace_select 0
Com_reset 0
Com_resignal 0
Com_revoke 0
Com_revoke_all 0
Com_rollback 0
Com_rollback_to_savepoint 0
Com_savepoint 0
Com_select 414
Com_set_option 525
Com_signal 0
Com_show_binlog_events 0
Com_show_binlogs 0
Com_show_charsets 0
Com_show_collations 0
Com_show_create_db 0
Com_show_create_event 0
Com_show_create_func 0
Com_show_create_proc 0
Com_show_create_table 260
Com_show_create_trigger 0
Com_show_databases 8
Com_show_engine_logs 0
Com_show_engine_mutex 0
Com_show_engine_status 0
Com_show_events 0
Com_show_errors 0
Com_show_fields 102
Com_show_function_code 0
Com_show_function_status 0
Com_show_grants 0
Com_show_keys 86
Com_show_master_status 0
Com_show_open_tables 0
Com_show_plugins 0
Com_show_privileges 0
Com_show_procedure_code 0
Com_show_procedure_status 0
Com_show_processlist 1
Com_show_profile 0
Com_show_profiles 115
Com_show_relaylog_events 0
Com_show_slave_hosts 0
Com_show_slave_status 0
Com_show_status 247
Com_show_storage_engines 0
Com_show_table_status 1
Com_show_tables 14
Com_show_triggers 5
Com_show_variables 5
Com_show_warnings 0
Com_slave_start 0
Com_slave_stop 0
Com_stmt_close 0
Com_stmt_execute 0
Com_stmt_fetch 0
Com_stmt_prepare 0
Com_stmt_reprepare 0
Com_stmt_reset 0
Com_stmt_send_long_data 0
Com_truncate 0
Com_uninstall_plugin 0
Com_unlock_tables 0
Com_update 27
Com_update_multi 0
Com_xa_commit 0
Com_xa_end 0
Com_xa_prepare 0
Com_xa_recover 0
Com_xa_rollback 0
Com_xa_start 0
Compression ON
Connection_errors_accept 0
Connection_errors_internal 0
Connection_errors_max_connections 0
Connection_errors_peer_address 0
Connection_errors_select 0
Connection_errors_tcpwrap 0
Connections 10
Created_tmp_disk_tables 128
Created_tmp_files 5
Created_tmp_tables 910
Delayed_errors 0
Delayed_insert_threads 0
Delayed_writes 0
Flush_commands 1
Handler_commit 108
Handler_delete 2
Handler_discover 0
Handler_external_lock 782
Handler_mrr_init 0
Handler_prepare 0
Handler_read_first 73
Handler_read_key 2109
Handler_read_last 0
Handler_read_next 42
Handler_read_prev 0
Handler_read_rnd 1882
Handler_read_rnd_next 94791
Handler_rollback 0
Handler_savepoint 0
Handler_savepoint_rollback 0
Handler_update 195
Handler_write 93316
Innodb_buffer_pool_dump_status not started
Innodb_buffer_pool_load_status not started
Innodb_buffer_pool_pages_data 397
Innodb_buffer_pool_bytes_data 6504448
Innodb_buffer_pool_pages_dirty 0
Innodb_buffer_pool_bytes_dirty 0
Innodb_buffer_pool_pages_flushed 193
Innodb_buffer_pool_pages_free 7795
Innodb_buffer_pool_pages_misc 0
Innodb_buffer_pool_pages_total 8192
Innodb_buffer_pool_read_ahead_rnd 0
Innodb_buffer_pool_read_ahead 0
Innodb_buffer_pool_read_ahead_evicted 0
Innodb_buffer_pool_read_requests 4642
Innodb_buffer_pool_reads 364
Innodb_buffer_pool_wait_free 0
Innodb_buffer_pool_write_requests 872
Innodb_data_fsyncs 129
Innodb_data_pending_fsyncs 0
Innodb_data_pending_reads 0
Innodb_data_pending_writes 0
Innodb_data_read 6033408
Innodb_data_reads 402
Innodb_data_writes 281
Innodb_data_written 6534656
Innodb_dblwr_pages_written 193
Innodb_dblwr_writes 14
Innodb_have_atomic_builtins ON
Innodb_log_waits 0
Innodb_log_write_requests 574
Innodb_log_writes 46
Innodb_os_log_fsyncs 61
Innodb_os_log_pending_fsyncs 0
Innodb_os_log_pending_writes 0
Innodb_os_log_written 202752
Innodb_page_size 16384
Innodb_pages_created 34
Innodb_pages_read 363
Innodb_pages_written 193
Innodb_row_lock_current_waits 0
Innodb_row_lock_time 0
Innodb_row_lock_time_avg 0
Innodb_row_lock_time_max 0
Innodb_row_lock_waits 0
Innodb_rows_deleted 0
Innodb_rows_inserted 3
Innodb_rows_read 406
Innodb_rows_updated 2
Innodb_num_open_files 32
Innodb_truncated_status_writes 0
Innodb_available_undo_logs 128
Key_blocks_not_flushed 0
Key_blocks_unused 14344
Key_blocks_used 3
Key_read_requests 381
Key_reads 1
Key_write_requests 117
Key_writes 50
Last_query_cost 0.000000
Last_query_partial_plans 0
Max_used_connections 3
Not_flushed_delayed_rows 0
Open_files 70
Open_streams 0
Open_table_definitions 120
Open_tables 117
Opened_files 1042
Opened_table_definitions 144
Opened_tables 147
Performance_schema_accounts_lost 0
Performance_schema_cond_classes_lost 0
Performance_schema_cond_instances_lost 0
Performance_schema_digest_lost 0
Performance_schema_file_classes_lost 0
Performance_schema_file_handles_lost 0
Performance_schema_file_instances_lost 0
Performance_schema_hosts_lost 0
Performance_schema_locker_lost 0
Performance_schema_mutex_classes_lost 0
Performance_schema_mutex_instances_lost 0
Performance_schema_rwlock_classes_lost 0
Performance_schema_rwlock_instances_lost 0
Performance_schema_session_connect_attrs_lost 0
Performance_schema_socket_classes_lost 0
Performance_schema_socket_instances_lost 0
Performance_schema_stage_classes_lost 0
Performance_schema_statement_classes_lost 0
Performance_schema_table_handles_lost 0
Performance_schema_table_instances_lost 0
Performance_schema_thread_classes_lost 0
Performance_schema_thread_instances_lost 0
Performance_schema_users_lost 0
Prepared_stmt_count 0
Qcache_free_blocks 1
Qcache_free_memory 1039896
Qcache_hits 0
Qcache_inserts 0
Qcache_lowmem_prunes 0
Qcache_not_cached 404
Qcache_queries_in_cache 0
Qcache_total_blocks 1
Queries 1888
Questions 1887
Select_full_join 1
Select_full_range_join 0
Select_range 23
Select_range_check 0
Select_scan 727
Slave_heartbeat_period 0.000
Slave_last_heartbeat ?
Slave_open_temp_tables 0
Slave_received_heartbeats 0
Slave_retried_transactions 0
Slave_running OFF
Slow_launch_threads 0
Slow_queries 0
Sort_merge_passes 0
Sort_range 0
Sort_rows 1964
Sort_scan 151
Ssl_accept_renegotiates 0
Ssl_accepts 0
Ssl_callback_cache_hits 0
Ssl_cipher ?
Ssl_cipher_list ?
Ssl_client_connects 0
Ssl_connect_renegotiates 0
Ssl_ctx_verify_depth 0
Ssl_ctx_verify_mode 0
Ssl_default_timeout 0
Ssl_finished_accepts 0
Ssl_finished_connects 0
Ssl_server_not_after ?
Ssl_server_not_before ?
Ssl_session_cache_hits 0
Ssl_session_cache_misses 0
Ssl_session_cache_mode NONE
Ssl_session_cache_overflows 0
Ssl_session_cache_size 0
Ssl_session_cache_timeouts 0
Ssl_sessions_reused 0
Ssl_used_session_cache_entries 0
Ssl_verify_depth 0
Ssl_verify_mode 0
Ssl_version ?
Table_locks_immediate 386
Table_locks_waited 0
Table_open_cache_hits 656
Table_open_cache_misses 130
Table_open_cache_overflows 0
Tc_log_max_pages_used 0
Tc_log_page_size 0
Tc_log_page_waits 0
Threads_cached 1
Threads_connected 2
Threads_created 3
Threads_running 1
Uptime 286258
Uptime_since_flush_status 286258

主要參數描述

Connections:視圖連接mysql服務器的次數

Uptime:服務器工作時間

Slow_queries:慢查詢的次數

Com_xxx表示每個xxx語句執行的次數

Com_select ?執行select次數

Com_insert ?執行insert次數,批量插入時候,只累加1次

Com_update 執行Update操作次數

Com_delete 執行刪除操作次數

innodb_rows_xxx類型的參數只對innodb存儲引擎有效

解析:通過上面一些參數,可以容易了解當前數據庫的應用時插入更新為主還是查詢為主,以及執行比例。對應更新操作的計數,是對執行次數的計數,不論提交還是回滾都會累加。

步驟二:定位執行效率較低的sql語句

通過慢查詢日志定位哪些是執行效率的sql語句。用–log-slow-queries[=file_name]選項啟動,mysqld寫一個包含所有執行超過long_query_time秒的sql語句的日志文件。關于如何定位慢查詢可以點解這里(http://www.php.cn/)


步驟三:通過EXPLAIN分析低效率SQL的執行計劃

在步驟二中,我們可以查詢到低效率的sql語句,在此我們通過explain或desc可以獲取mysql執行select信息。

eg:

EXPLAIN?  SELECT?  ??t0.*?  FROM  ??t3?AS?t0  ??LEFT?JOIN?`t2`?AS?t1?  ????ON?t0.`id1`?=?t1.`id1`?  WHERE?t0.id1?=?5?;

執行結果如下:

MySQL優化的步驟詳解

解析:select_type:表示select類型。常見的取值有SIMPLE(簡單表,即不使用連接或者子查詢)、PRIMARY(主查詢,即外層的查詢)、UNION(union中的第二個或者后面的查詢語句)、SUBQUERY(子查詢中的第一個SELECT)等。
talbe:輸出結果集的表。

type:表的連接類型。性能由高到底:system(表中僅有一行)、const(表中最多有一個匹配行)、eq_ref、ref、ref_null、index_merge、unique_subquery、index_subquery、range、idnex等

possible_keys:查詢時,可能使用的索引

key:實際使用的索引

key_len:索引字段的長度

rows:掃描行的數量

Extra:執行情況的說明和描述

步驟四:確定問題并采取相應的優化措施

經過上面的步驟,可以確定問題出現的原因,此時我們可以根據情況,采取相應的措施。常見的措施有1.建立相應的索引2.優化sql語句3.分表等。

備注:如果索引正在工作,handler_read_key的值將很高,這個值代表了一個行被索引值讀的次數,很低的值表名增加索引得到的性能改善不高,因為索引并不經常使用。handler_read_rnd_next值高則意味著查詢運行低效,并且應該建立索引補救。如果正在進行大量的表掃描,handler_read_rnd_next值較高,則通常說明表索引不正確或寫入的查詢沒有利用索引,如下圖。

MySQL優化的步驟詳解

我們應當定期分析表盒檢查表

檢查表使用如下命令(檢查t3表)

ANALYZE TABLE t3;
CHECK TABLE t3;

定期優化表使用命令如下

optimize table 表名

常見語句優化

1.優化Insert語句

(1)如果從同一個客戶端插入數據,盡力使用多個字表的insert語句和多行插入,減少單行插入,這種方式大大減少客戶端與數據庫直接的連接、關閉等消耗。eg:

INSERT INTO t3 VALUES(1,2),(8,5),(6,5),(4,3)

(2)如果從不同的客戶插入很多行,能通過使用inset delayed語句得到更高的速度。

(3)如果進行批量插入,可以增加bulk_insert_buffer_size變量方法,提高速度。

2.優化group by語句

默認情況下使用group by col1,col2….會對查詢進行相應的排序,如果用戶想要避免排序結果的消耗,可以指定order by null 禁止排序。通過查詢結果中extra字段可以看出:

MySQL優化的步驟詳解

MySQL優化的步驟詳解

3.優化order by語句

在某些情況中,mysql可以使用一個索引來滿足order by子句,而不需要額外的排序,where條件和order by使用相同的索引。

4.優化含有or語句

對于含有or的查詢子句,如果要使用索引,則or之間的每個條件列必須用到索引;否則,應該考慮添加索引。

5.使用sql提示

以上就是MySQL優化的步驟詳解的內容,更多相關內容請關注PHP中文網(www.php.cn)!

? 版權聲明
THE END
喜歡就支持一下吧
點贊10 分享