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朋友們,分享一些他們的技術見解和生活故事。