日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql 优化一

發布時間:2025/7/14 数据库 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql 优化一 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

從幾個方面出發:

① 數據庫設計
② sql語句優化
③ 數據庫參數配置
④ 恰當的硬件資源和操作系統

?

?

下面詳細介紹:

① 數據庫設計

 通俗地理解三個范式,對于數據庫設計大有好處。在數據庫設計中,為了更好地應用三個范式,就必須通俗地理解三個范式(通俗地理解是夠用的理解,并不是最      科學最準確的理解):
第一范式:1NF是對屬性的原子性約束,要求屬性具有原子性,不可再分解;(只要是關系型數據庫都滿足1NF)
第二范式:2NF是對記錄的惟一性約束,要求記錄有惟一標識,即實體的惟一性;
第三范式:3NF是對字段冗余性的約束,即任何字段不能由其他字段派生出來,它要求字段沒有冗余。 沒有冗余的數據庫設計可以做到。
但是,沒有冗余的數據庫未必是最好的數據庫,有時為了提高運行效率,就必須降低范式標準,適當保留冗余數據。具體做法是: 在概念數據模型設計時遵守第三范式,降低范式標準的工作放到物理數據模型設計時考慮。降低范式就是增加字段,允許冗余。

② sql語句優化

通過show status命令了解各種SQL的執行頻率。
定位執行效率較低的SQL語句-(重點select)
通過explain分析低效率的SQL語句的執行情況
確定問題并采取相應的優化措施

MySQL客戶端連接成功后,通過使用show [session|global] status 命令可以提供服務器狀態信息。其中的session來表示當前的連接的統計結果,global來表示自數據庫上次啟動至今的統計結果。默認是session級別的。 下面的例子: show status like ‘Com_%’; 其中Com_XXX表示XXX語句所執行的次數。 重點注意:Com_select,Com_insert,Com_update,Com_delete通過這幾個參數,可以容易地了解到當前數據庫的應用是以插入更新為主還是以查詢操作為主,以及各類的SQL大致的執行比例是多少。
還有幾個常用的參數便于用戶了解數據庫的基本情況。 Connections:試圖連接MySQL服務器的次數 Uptime:服務器工作的時間(單位秒) Slow_queries:慢查詢的次數 (默認是10)

在默認情況下mysql不記錄慢查詢日志,需要在啟動的時候指定
?bin\mysqld.exe - -slow-query-log

?

通過慢查詢日志定位執行效率較低的SQL語句。慢查詢日志記錄了所有執行時間超過long_query_time所設置的SQL語句。 show variables like ‘long_query_time’; set long_query_time=2;
測試語句
?select * from emp e,dept d where e.empno=123451? and e.deptno=d.deptno;
?查看慢查詢日志:默認為數據目錄data中的host-name-slow.log。低版本的mysql需要通過在開啟mysql時使用- -log-slow-queries[=file_name]來配置

?

?

?

1, 查看MySQL服務器配置信息

      mysql>?show?variables;??

2, 查看MySQL服務器運行的各種狀態值

      mysql>?show?global?status;?

3, 慢查詢

Java代碼 ?
  • mysql>?show?variables?like?'%slow%'; ??
  • +------------------+-------+ ??
  • |?Variable_name????|?Value?| ??
  • +------------------+-------+ ??
  • |?log_slow_queries?|?OFF???| ??
  • |?slow_launch_time?|?2?????| ??
  • +------------------+-------+ ??
  • mysql>?show?global?status?like?'%slow%'; ??
  • +---------------------+-------+ ??
  • |?Variable_name???????|?Value?| ??
  • +---------------------+-------+ ??
  • |?Slow_launch_threads?|?0?????| ??
  • |?Slow_queries????????|?279???| ??
  • +---------------------+-------+??
  • mysql> show variables like '%slow%'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | log_slow_queries | OFF | | slow_launch_time | 2 | +------------------+-------+ mysql> show global status like '%slow%'; +---------------------+-------+ | Variable_name | Value | +---------------------+-------+ | Slow_launch_threads | 0 | | Slow_queries | 279 | +---------------------+-------+


    配置中關閉了記錄慢查詢(最好是打開,方便優化),超過2秒即為慢查詢,一共有279條慢查詢

    4, 連接數

    Java代碼 ?
  • mysql>?show?variables?like?'max_connections'; ??
  • +-----------------+-------+ ??
  • |?Variable_name???|?Value?| ??
  • +-----------------+-------+ ??
  • |?max_connections?|?500???| ??
  • +-----------------+-------+ ??
  • ??
  • mysql>?show?global?status?like?'max_used_connections'; ??
  • +----------------------+-------+ ??
  • |?Variable_name????????|?Value?| ??
  • +----------------------+-------+ ??
  • |?Max_used_connections?|?498???| ??
  • +----------------------+-------+??
  • mysql> show variables like 'max_connections'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | max_connections | 500 | +-----------------+-------+mysql> show global status like 'max_used_connections'; +----------------------+-------+ | Variable_name | Value | +----------------------+-------+ | Max_used_connections | 498 | +----------------------+-------+


    設置的最大連接數是500,而響應的連接數是498

    max_used_connections / max_connections * 100% = 99.6% (理想值 ≈ 85%)

    5, key_buffer_size
    key_buffer_size是對MyISAM表性能影響最大的一個參數, 不過數據庫中多為Innodb

    Java代碼 ?
  • mysql>?show?variables?like?'key_buffer_size'; ??
  • +-----------------+----------+ ??
  • |?Variable_name???|?Value????| ??
  • +-----------------+----------+ ??
  • |?key_buffer_size?|?67108864?| ??
  • +-----------------+----------+ ??
  • ??
  • mysql>?show?global?status?like?'key_read%'; ??
  • +-------------------+----------+ ??
  • |?Variable_name?????|?Value????| ??
  • +-------------------+----------+ ??
  • |?Key_read_requests?|?25629497?| ??
  • |?Key_reads?????????|?66071????| ??
  • +-------------------+----------+??
  • mysql> show variables like 'key_buffer_size'; +-----------------+----------+ | Variable_name | Value | +-----------------+----------+ | key_buffer_size | 67108864 | +-----------------+----------+mysql> show global status like 'key_read%'; +-------------------+----------+ | Variable_name | Value | +-------------------+----------+ | Key_read_requests | 25629497 | | Key_reads | 66071 | +-------------------+----------+


    一共有25629497個索引讀取請求,有66071個請求在內存中沒有找到直接從硬盤讀取索引,計算索引未命中緩存的概率:
    key_cache_miss_rate = Key_reads / Key_read_requests * 100% =0.27%
    需要適當加大key_buffer_size

    Java代碼 ?
  • mysql>?show?global?status?like?'key_blocks_u%'; ??
  • +-------------------+-------+ ??
  • |?Variable_name?????|?Value?| ??
  • +-------------------+-------+ ??
  • |?Key_blocks_unused?|?10285?| ??
  • |?Key_blocks_used???|?47705?| ??
  • +-------------------+-------+??
  • mysql> show global status like 'key_blocks_u%'; +-------------------+-------+ | Variable_name | Value | +-------------------+-------+ | Key_blocks_unused | 10285 | | Key_blocks_used | 47705 | +-------------------+-------+


    Key_blocks_unused表示未使用的緩存簇(blocks)數,Key_blocks_used表示曾經用到的最大的blocks數
    Key_blocks_used / (Key_blocks_unused + Key_blocks_used) * 100% ≈ 18% (理想值 ≈ 80%)

    6, 臨時表

    Java代碼 ?
  • mysql>?show?global?status?like?'created_tmp%'; ??
  • +-------------------------+---------+ ??
  • |?Variable_name???????????|?Value???| ??
  • +-------------------------+---------+ ??
  • |?Created_tmp_disk_tables?|?4184337?| ??
  • |?Created_tmp_files???????|?4124????| ??
  • |?Created_tmp_tables??????|?4215028?| ??
  • +-------------------------+---------+??
  • mysql> show global status like 'created_tmp%'; +-------------------------+---------+ | Variable_name | Value | +-------------------------+---------+ | Created_tmp_disk_tables | 4184337 | | Created_tmp_files | 4124 | | Created_tmp_tables | 4215028 | +-------------------------+---------+


    每次創建臨時表,Created_tmp_tables增加,如果是在磁盤上創建臨時表,Created_tmp_disk_tables也增加,Created_tmp_files表示MySQL服務創建的臨時文件文件數:
    Created_tmp_disk_tables / Created_tmp_tables * 100% = 99% (理想值<= 25%)

    Java代碼 ?
  • mysql>?show?variables?where?Variable_name?in?('tmp_table_size',?'max_heap_table_size'); ??
  • +---------------------+-----------+ ??
  • |?Variable_name???????|?Value?????| ??
  • +---------------------+-----------+ ??
  • |?max_heap_table_size?|?134217728?| ??
  • |?tmp_table_size??????|?134217728?| ??
  • +---------------------+-----------+??
  • mysql> show variables where Variable_name in ('tmp_table_size', 'max_heap_table_size'); +---------------------+-----------+ | Variable_name | Value | +---------------------+-----------+ | max_heap_table_size | 134217728 | | tmp_table_size | 134217728 | +---------------------+-----------+


    需要增加tmp_table_size

    7,open table 的情況

    Java代碼 ?
  • mysql>?show?global?status?like?'open%tables%'; ??
  • +---------------+-------+ ??
  • |?Variable_name?|?Value?| ??
  • +---------------+-------+ ??
  • |?Open_tables???|?1024??| ??
  • |?Opened_tables?|?1465??| ??
  • +---------------+-------+??
  • mysql> show global status like 'open%tables%'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Open_tables | 1024 | | Opened_tables | 1465 | +---------------+-------+


    Open_tables 表示打開表的數量,Opened_tables表示打開過的表數量,如果Opened_tables數量過大,說明配置中 table_cache(5.1.3之后這個值叫做table_open_cache)值可能太小,我們查詢一下服務器table_cache值

    Java代碼 ?
  • mysql>?show?variables?like?'table_cache'; ??
  • +---------------+-------+ ??
  • |?Variable_name?|?Value?| ??
  • +---------------+-------+ ??
  • |?table_cache???|?1024??| ??
  • +---------------+-------+??
  • mysql> show variables like 'table_cache'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | table_cache | 1024 | +---------------+-------+



    Open_tables / Opened_tables * 100% =69% 理想值 (>= 85%)
    Open_tables / table_cache * 100% = 100% 理想值 (<= 95%)

    8, 進程使用情況

    Java代碼 ?
  • mysql>?show?global?status?like?'Thread%'; ??
  • +-------------------+-------+ ??
  • |?Variable_name?????|?Value?| ??
  • +-------------------+-------+ ??
  • |?Threads_cached????|?31????| ??
  • |?Threads_connected?|?239???| ??
  • |?Threads_created???|?2914??| ??
  • |?Threads_running???|?4?????| ??
  • +-------------------+-------+??
  • mysql> show global status like 'Thread%'; +-------------------+-------+ | Variable_name | Value | +-------------------+-------+ | Threads_cached | 31 | | Threads_connected | 239 | | Threads_created | 2914 | | Threads_running | 4 | +-------------------+-------+


    如果我們在MySQL服務器配置文件中設置了thread_cache_size,當客戶端斷開之后,服務器處理此客戶的線程將會緩存起來以響應下一個客戶而不是銷毀(前提是緩存數未達上限)。Threads_created表示創建過的線程數,如果發現Threads_created值過大的話,表明 MySQL服務器一直在創建線程,這也是比較耗資源,可以適當增加配置文件中thread_cache_size值,查詢服務器 thread_cache_size配置:

    Java代碼 ?
  • mysql>?show?variables?like?'thread_cache_size'; ??
  • +-------------------+-------+ ??
  • |?Variable_name?????|?Value?| ??
  • +-------------------+-------+ ??
  • |?thread_cache_size?|?32????| ??
  • +-------------------+-------+??
  • mysql> show variables like 'thread_cache_size'; +-------------------+-------+ | Variable_name | Value | +-------------------+-------+ | thread_cache_size | 32 | +-------------------+-------+



    9, 查詢緩存(query cache)

    Java代碼 ?
  • mysql>?show?global?status?like?'qcache%'; ??
  • +-------------------------+----------+ ??
  • |?Variable_name???????????|?Value????| ??
  • +-------------------------+----------+ ??
  • |?Qcache_free_blocks??????|?2226?????| ??
  • |?Qcache_free_memory??????|?10794944?| ??
  • |?Qcache_hits?????????????|?5385458??| ??
  • |?Qcache_inserts??????????|?1806301??| ??
  • |?Qcache_lowmem_prunes????|?433101???| ??
  • |?Qcache_not_cached???????|?4429464??| ??
  • |?Qcache_queries_in_cache?|?7168?????| ??
  • |?Qcache_total_blocks?????|?16820????| ??
  • +-------------------------+----------+??
  • mysql> show global status like 'qcache%'; +-------------------------+----------+ | Variable_name | Value | +-------------------------+----------+ | Qcache_free_blocks | 2226 | | Qcache_free_memory | 10794944 | | Qcache_hits | 5385458 | | Qcache_inserts | 1806301 | | Qcache_lowmem_prunes | 433101 | | Qcache_not_cached | 4429464 | | Qcache_queries_in_cache | 7168 | | Qcache_total_blocks | 16820 | +-------------------------+----------+


    Qcache_free_blocks:緩存中相鄰內存塊的個數。數目大說明可能有碎片。FLUSH QUERY CACHE會對緩存中的碎片進行整理,從而得到一個空閑塊。
    Qcache_free_memory:緩存中的空閑內存。
    Qcache_hits:每次查詢在緩存中命中時就增大
    Qcache_inserts:每次插入一個查詢時就增大。命中次數除以插入次數就是不中比率。
    Qcache_lowmem_prunes:緩存出現內存不足并且必須要進行清理以便為更多查詢提供空間的次數。這個數字最好長時間來看;如果這個數字在不斷增長,就表示可能碎片非常嚴重,或者內存很少。(上面的????????? free_blocks和free_memory可以告訴您屬于哪種情況)
    Qcache_not_cached:不適合進行緩存的查詢的數量,通常是由于這些查詢不是 SELECT 語句或者用了now()之類的函數。
    Qcache_queries_in_cache:當前緩存的查詢(和響應)的數量。
    Qcache_total_blocks:緩存中塊的數量。

    我們再查詢一下服務器關于query_cache的配置:

    Java代碼 ?
  • mysql>?show?variables?like?'query_cache%'; ??
  • +------------------------------+----------+ ??
  • |?Variable_name????????????????|?Value????| ??
  • +------------------------------+----------+ ??
  • |?query_cache_limit????????????|?33554432?| ??
  • |?query_cache_min_res_unit?????|?4096?????| ??
  • |?query_cache_size?????????????|?33554432?| ??
  • |?query_cache_type?????????????|?ON???????| ??
  • |?query_cache_wlock_invalidate?|?OFF??????| ??
  • +------------------------------+----------+??
  • mysql> show variables like 'query_cache%'; +------------------------------+----------+ | Variable_name | Value | +------------------------------+----------+ | query_cache_limit | 33554432 | | query_cache_min_res_unit | 4096 | | query_cache_size | 33554432 | | query_cache_type | ON | | query_cache_wlock_invalidate | OFF | +------------------------------+----------+


    各字段的解釋:

    query_cache_limit:超過此大小的查詢將不緩存
    query_cache_min_res_unit:緩存塊的最小大小
    query_cache_size:查詢緩存大小
    query_cache_type:緩存類型,決定緩存什么樣的查詢,示例中表示不緩存 select sql_no_cache 查詢
    query_cache_wlock_invalidate:當有其他客戶端正在對MyISAM表進行寫操作時,如果查詢在query cache中,是否返回cache結果還是等寫操作完成再讀表獲取結果。

    query_cache_min_res_unit的配置是一柄”雙刃劍”,默認是4KB,設置值大對大數據查詢有好處,但如果你的查詢都是小數據查詢,就容易造成內存碎片和浪費。

    查詢緩存碎片率 = Qcache_free_blocks / Qcache_total_blocks * 100%

    如果查詢緩存碎片率超過20%,可以用FLUSH QUERY CACHE整理緩存碎片,或者試試減小query_cache_min_res_unit,如果你的查詢都是小數據量的話。

    查詢緩存利用率 = (query_cache_size – Qcache_free_memory) / query_cache_size * 100%

    查詢緩存利用率在25%以下的話說明query_cache_size設置的過大,可適當減小;查詢緩存利用率在80%以上而且Qcache_lowmem_prunes > 50的話說明query_cache_size可能有點小,要不就是碎片太多。

    查詢緩存命中率 = (Qcache_hits – Qcache_inserts) / Qcache_hits * 100%

    示例服務器 查詢緩存碎片率 = 20.46%,查詢緩存利用率 = 62.26%,查詢緩存命中率 = 1.94%,命中率很差,可能寫操作比較頻繁吧,而且可能有些碎片。

    10,排序使用情況

    Java代碼 ?
  • mysql>?show?global?status?like?'sort%'; ??
  • +-------------------+----------+ ??
  • |?Variable_name?????|?Value????| ??
  • +-------------------+----------+ ??
  • |?Sort_merge_passes?|?2136?????| ??
  • |?Sort_range????????|?81888????| ??
  • |?Sort_rows?????????|?35918141?| ??
  • |?Sort_scan?????????|?55269????| ??
  • +-------------------+----------+??
  • mysql> show global status like 'sort%'; +-------------------+----------+ | Variable_name | Value | +-------------------+----------+ | Sort_merge_passes | 2136 | | Sort_range | 81888 | | Sort_rows | 35918141 | | Sort_scan | 55269 | +-------------------+----------+



    Sort_merge_passes 包括兩步。MySQL 首先會嘗試在內存中做排序,使用的內存大小由系統變量 Sort_buffer_size 決定,如果它的大小不夠把所有的記錄都讀到內存中,MySQL 就會把每次在內存中排序的結果存到臨時文件中,等 MySQL 找到所有記錄之后,再把臨時文件中的記錄做一次排序。這再次排序就會增加 Sort_merge_passes。實際上,MySQL 會用另一個臨時文件來存再次排序的結果,所以通常會看到 Sort_merge_passes 增加的數值是建臨時文件數的兩倍。因為用到了臨時文件,所以速度可能會比較慢,增加 Sort_buffer_size 會減少 Sort_merge_passes 和 創建臨時文件的次數。但盲目的增加 Sort_buffer_size 并不一定能提高速度,見 How fast can you sort data with MySQL?(引自http://qroom.blogspot.com/2007/09/mysql-select-sort.html)

    另外,增加read_rnd_buffer_size(3.2.3是record_rnd_buffer_size)的值對排序的操作也有一點的好處,參見:http://www.mysqlperformanceblog.com/2007/07/24/what-exactly-is- read_rnd_buffer_size/

    11.文件打開數(open_files)

    Java代碼 ?
  • mysql>?show?global?status?like?'open_files'; ??
  • +---------------+-------+ ??
  • |?Variable_name?|?Value?| ??
  • +---------------+-------+ ??
  • |?Open_files????|?821???| ??
  • +---------------+-------+ ??
  • ??
  • mysql>?show?variables?like?'open_files_limit'; ??
  • +------------------+-------+ ??
  • |?Variable_name????|?Value?| ??
  • +------------------+-------+ ??
  • |?open_files_limit?|?65535?| ??
  • +------------------+-------+??
  • mysql> show global status like 'open_files'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Open_files | 821 | +---------------+-------+mysql> show variables like 'open_files_limit'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | open_files_limit | 65535 | +------------------+-------+


    比較合適的設置:Open_files / open_files_limit * 100% <= 75%

    正常

    12。 表鎖情況

    Java代碼 ?
  • mysql>?show?global?status?like?'table_locks%'; ??
  • +-----------------------+---------+ ??
  • |?Variable_name?????????|?Value???| ??
  • +-----------------------+---------+ ??
  • |?Table_locks_immediate?|?4257944?| ??
  • |?Table_locks_waited????|?25182???| ??
  • +-----------------------+---------+??
  • mysql> show global status like 'table_locks%'; +-----------------------+---------+ | Variable_name | Value | +-----------------------+---------+ | Table_locks_immediate | 4257944 | | Table_locks_waited | 25182 | +-----------------------+---------+


    Table_locks_immediate 表示立即釋放表鎖數,Table_locks_waited表示需要等待的表鎖數,如果 Table_locks_immediate / Table_locks_waited > 5000,最好采用InnoDB引擎,因為InnoDB是行鎖而MyISAM是表鎖,對于高并發寫入的應用InnoDB效果會好些.

    13. 表掃描情況

    Java代碼 ?
  • mysql>?show?global?status?like?'handler_read%'; ??
  • +-----------------------+-----------+ ??
  • |?Variable_name?????????|?Value?????| ??
  • +-----------------------+-----------+ ??
  • |?Handler_read_first????|?108763????| ??
  • |?Handler_read_key??????|?92813521??| ??
  • |?Handler_read_next?????|?486650793?| ??
  • |?Handler_read_prev?????|?688726????| ??
  • |?Handler_read_rnd??????|?9321362???| ??
  • |?Handler_read_rnd_next?|?153086384?| ??
  • +-----------------------+-----------+??
  • mysql> show global status like 'handler_read%'; +-----------------------+-----------+ | Variable_name | Value | +-----------------------+-----------+ | Handler_read_first | 108763 | | Handler_read_key | 92813521 | | Handler_read_next | 486650793 | | Handler_read_prev | 688726 | | Handler_read_rnd | 9321362 | | Handler_read_rnd_next | 153086384 | +-----------------------+-----------+



    各字段解釋參見http://hi.baidu.com/thinkinginlamp/blog/item/31690cd7c4bc5cdaa144df9c.html,調出服務器完成的查詢請求次數:

    Java代碼 ?
  • mysql>?show?global?status?like?'com_select'; ??
  • +---------------+---------+ ??
  • |?Variable_name?|?Value???| ??
  • +---------------+---------+ ??
  • |?Com_select????|?2693147?| ??
  • +---------------+---------+??
  • mysql> show global status like 'com_select'; +---------------+---------+ | Variable_name | Value | +---------------+---------+ | Com_select | 2693147 | +---------------+---------+



    計算表掃描率:

    表掃描率 = Handler_read_rnd_next / Com_select

    如果表掃描率超過4000,說明進行了太多表掃描,很有可能索引沒有建好,增加read_buffer_size值會有一些好處,但最好不要超過8MB。

    1先隨機寫了,日后整理:

    測試方法,explain 執行sql -\G 來分析,例如:禁止排序,可以加快速度,查詢速度

    沒有優化的語句:

    優化過后的語句:

    ?

    轉載于:https://www.cnblogs.com/legend-song/p/3660436.html

    總結

    以上是生活随笔為你收集整理的mysql 优化一的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。