mysql實戰操作總結

1、問題描述

關於mysql操作,記錄下;

2、問題說明

1.停止正在執行的sql

數據量太大,數據庫沒反應,用的navicat,就在查詢頁面,執行:

show processlist;

---會顯示對應的查詢sql找到最前面是id,執行kill id就可以了
kill  id 

2.mysql分區

分區可以在不改變表名,邏輯不變的情況下,增加mysql處理數據的能力;

分區網上有很多介紹,具體概念自己查吧,我們項目中是數據量太大,要按照日期分區,分區鍵是:varchar類型的timestamp,網上的用TO_DAYS,unitime什麼的都用不了,用的COLUMNS創建的;

說明:

(1) 創建前首先要將分區鍵設置成主鍵/聯合主鍵,假如表中已經有id作爲主鍵了,再設置createDate主鍵就可以了(聯合主鍵);

(2)分區創建sql

alter table zy_sjgl partition by range COLUMNS(createDate) (   
partition p20221101 values less than ('2022-11-01'),
partition p20221102 values less than ('2022-11-02'),
partition p20221103 values less than ('2022-11-03'),
partition px values less than maxvalue
);

用的範圍分區,比如:2022-11-01的數據,實際進的p20221102這個分區;

mysql5.7以前最多分1024個,5.7(含)以後最多8196個(親測有效)

(3)查詢各個分區數據情況

自己可以插入測試表數據,可以看下效果

select 
  partition_name part,  
  partition_expression expr,  
  partition_description descr,  
  table_rows  
from information_schema.partitions  where 
  table_schema = schema()  
  and table_name='zy_sjgl';  

(4)分區操作

清空分區中數據,分區還在,跟truncate table 一個概念,清理數據:

alter table zy_sjgl truncate partition p20221101; 

刪除分區,分區直接就刪除了,跟drop table一個概念:

alter table bm_scenes_data_reminder drop partition p20210104; 

增加分區,這裏有個點,新增分區,假如上次第一次分區有max,簡單說新增的分區less than,不能中間插入,只能最後插入,假如有比他大的分區,比如你要插入分區5,目前分區已經有6了,插入不成功,需要把6刪除了,5和6一起創建,新增分區語句:

先刪:
ALTER TABLE zy_sjgl DROP PARTITION px;

後建:
ALTER TABLE zy_sjgl ADD partition (partition p20230701 values less than ('2023-07-01'));
ALTER TABLE zy_sjgl ADD partition (partition px values less than maxvalue);

3、mysql表鎖了,Waiting for table metadata lock

mysql表鎖了,服務器重啓,表正在插入數據,鎖了,通過查看發現:Waiting for table metadata lock

有時候通過:show processlist;找不到,可以試試下面這個:

select * from performance_schema.events_statements_current

然後再kill id

4、msyql查詢增加序號

用戶導出的csv或者excel需要帶個序號,方便查看,方式:select 前面用(@i:=@i+1) AS '序號',from後跟(SELECT @i:=0) AS itable,需要特別說明,sql中有groupby的話,序號要放到最外面,否則序號會斷,簡單說比如1、2、3一個組,最終分組導入的時候就剩下1了,序號就跳了,用select包一下再排序就好了。

select (@i:=@i+1) AS '序號', t2.* from (select
        *
        from zy_sjgl t1
            group by t1.SJGL_SJC
            order by t1.SJGL_SJC asc) t2,(SELECT @i:=0) AS itable
        </where>

5.mysql服務器參數配置

服務器參數優化,並不一定符合所有人,參數配置在my文件中:

table_open_cache=5120
max_allowed_packet=1024M;
innodb_buffer_pool_size=8192M
innodb_buffer_pool_instances=8
innodb_log_files_in_group=3 
innodb_lock_wait_timeout=120 
thread_cache_size=300
bulk_insert_buffer_size=1024M

innodb_buffer_pool_size,緩衝池大小,Innodb類型數據庫,內存夠的情況下,大一些;


更多信息請關注公衆號:「軟件老王」,關注不迷路,軟件老王和他的IT朋友們,分享一些他們的技術見解和生活故事。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章