主頁 >  其他 > 一文看懂 MySQL 高性能優化技巧實踐

一文看懂 MySQL 高性能優化技巧實踐

2021-09-08 08:33:31 其他

一、背景

最近公司專案添加新功能,上線后發現有些功能的串列查詢時間很久,原因是新功能用到舊功能的介面,而這些舊介面的 SQL 查詢陳述句關聯5,6張表且撰寫不夠規范,導致 MySQL 在執行 SQL 陳述句時索引失效,進行全表掃描,原本負責優化的同事有事請假回家,因此優化查詢資料的問題落在筆者手中,筆者在查閱網上 SQL 優化的資料后成功解決了問題,在此從全域角度記錄和總結 MySQL 查詢優化相關技巧,

二、優化思路

資料查詢慢,不代表 SQL 陳述句寫法有問題, 首先,我們需要找到問題的源頭才能“對癥下藥”,筆者用一張流程圖展示 MySQL 優化的思路:

無需更多言語,從圖中可以清楚地看出,導致資料查詢慢的原因有多種,如:快取失效,在此一段時間內由于高并發訪問導致 MySQL 服務器崩潰;SQL 陳述句撰寫問題;MySQL 服務器引數問題;硬體配置限制 MySQL 服務性能問題等,

三、查看 MySQL 服務器運行的狀態值

如果系統的并發請求數不高,且查詢速度慢,可以忽略該步驟直接進行 SQL 陳述句調優步驟,

執行命令:

show status

由于回傳結果太多,此處不貼出結果,其中,再回傳的結果中,我們主要關注 “Queries”、“Threads_connected” 和 “Threads_running” 的值,即查詢次數、執行緒連接數和執行緒運行數,

我們可以通過執行如下腳本監控 MySQL 服務器運行的狀態值

#!/bin/bash
while true
do
mysqladmin -uroot -p"密碼" ext | awk '/Queries/{q=$4}/Threads_connected/{c=$4}/Threads_running/{r=$4}END{printf("%d %d %d\n",q,c,r)}' >> status.txt
sleep 1
done

執行該腳本 24 小時,獲取 status.txt 里的內容,再次通過 awk 計算每秒請求 MySQL 服務的次數

awk '{q=$1-last;last=$1}{printf("%d %d %d\n",q,$2,$3)}' status.txt

復制計算好的內容到 Excel 中生成圖表觀察資料周期性,

如果觀察的資料有周期性的變化,如上圖的解釋,需要修改快取失效策略,

例如:

通過亂數在[3,6,9] 區間獲取其中一個值作為快取失效時間,這樣分散了快取失效時間,從而節省了一部分記憶體的消耗,

當訪問高峰期時,一部分請求分流到未失效的快取,另一部分則訪問 MySQL 資料庫,這樣減少了 MySQL 服務器的壓力,

四、獲取需要優化的 SQL 陳述句

### 4.1 方式一:查看運行的執行緒

執行命令:

show processlist

回傳結果:

mysql> show processlist;
+----+------+-----------+------+---------+------+----------+------------------+
| Id | User | Host      | db   | Command | Time | State    | Info             |
+----+------+-----------+------+---------+------+----------+------------------+
|  9 | root | localhost | test | Query   |    0 | starting | show processlist |
+----+------+-----------+------+---------+------+----------+------------------+
1 row in set (0.00 sec)

從回傳結果中我們可以了解該執行緒執行了什么命令/SQL 陳述句以及執行的時間,實際應用中,查詢的回傳結果會有 N 條記錄,

其中,回傳的 State 的值是我們判斷性能好壞的關鍵,其值出現如下內容,則該行記錄的 SQL 陳述句需要優化:

Converting HEAP to MyISAM # 查詢結果太大時,把結果放到磁盤,嚴重
Create tmp table #創建臨時表,嚴重
Copying to tmp table on disk  #把記憶體臨時表復制到磁盤,嚴重
locked #被其他查詢鎖住,嚴重
loggin slow query #記錄慢查詢
Sorting result #排序

State 欄位有很多值,如需了解更多,可以參看文章末尾提供的鏈接,

### 4.2 方式二:開啟慢查詢日志

在組態檔 my.cnf 中的 [mysqld] 一行下邊添加兩個引數:

slow_query_log = 1
slow_query_log_file=/var/lib/mysql/slow-query.log
long_query_time = 2

log_queries_not_using_indexes = 1

其中,slow_query_log = 1 表示開啟慢查詢;

slow_query_log_file 表示慢查詢日志存放的位置;

long_query_time = 2 表示查詢 >=2 秒才記錄日志;

log_queries_not_using_indexes = 1 記錄沒有使用索引的 SQL 陳述句,

注意:slow_query_log_file 的路徑不能隨便寫,否則 MySQL 服務器可能沒有權限將日志檔案寫到指定的目錄中,建議直接復制上文的路徑,

修改保存檔案后,重啟 MySQL 服務,在 /var/lib/mysql/ 目錄下會創建 slow-query.log 日志檔案,連接 MySQL 服務端執行如下命令可以查看配置情況,

show variables like 'slow_query%';

show variables like 'long_query_time';

測驗慢查詢日志:

mysql> select sleep(2);
+----------+
| sleep(2) |
+----------+
|        0 |
+----------+
1 row in set (2.00 sec)

打開慢查詢日志檔案

[root@localhost mysql]# vim /var/lib/mysql/slow-query.log
/usr/sbin/mysqld, Version: 5.7.19-log (MySQL Community Server (GPL)). started with:
Tcp port: 0  Unix socket: /var/lib/mysql/mysql.sock
Time                 Id Command    Argument
# Time: 2017-10-05T04:39:11.408964Z
# User@Host: root[root] @ localhost []  Id:     3
# Query_time: 2.001395  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 0
use test;
SET timestamp=1507178351;
select sleep(2);

我們可以看到剛才執行了 2 秒的 SQL 陳述句被記錄下來了,

雖然在慢查詢日志中記錄查詢慢的 SQL 資訊,但是日志記錄的內容密集且不易查閱,因此,我們需要通過工具將 SQL 篩選出來,

MySQL 提供 mysqldumpslow 工具對日志進行分析,我們可以使用 mysqldumpslow --help 查看命令相關用法,

常用引數如下:

    -s:排序方式,后邊接著如下引數
        c:訪問次數
        l:鎖定時間
        r:回傳記錄
        t:查詢時間
    al:平均鎖定時間
    ar:平均回傳記錄書
    at:平均查詢時間
    -t:回傳前面多少條的資料
    -g:翻遍搭配一個正則運算式,大小寫不敏感

案例:

獲取回傳記錄集最多的10個sql
mysqldumpslow -s r -t 10 /var/lib/mysql/slow-query.log

獲取訪問次數最多的10個sql
mysqldumpslow -s c -t 10 /var/lib/mysql/slow-query.log

獲取按照時間排序的前10條里面含有左連接的查詢陳述句
mysqldumpslow -s t -t 10 -g "left join" /var/lib/mysql/slow-query.log

五、分析 SQL 陳述句

5.1 方式一:explain

篩選出有問題的 SQL,我們可以使用 MySQL 提供的 explain 查看 SQL 執行計劃情況(關聯表,表查詢順序、索引使用情況等),

用法:

explain select * from category;

回傳結果:

mysql> explain select * from category;
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table    | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra |
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------+
|  1 | SIMPLE      | category | NULL       | ALL  | NULL          | NULL | NULL    | NULL |    1 |   100.00 | NULL  |
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------+
1 row in set, 1 warning (0.00 sec)

欄位解釋:

1. id:select 查詢序列號,id相同,執行順序由上至下;id不同,id值越大優先級越高,越先被執行

2. select_type:查詢資料的操作型別,其值如下:

simple:簡單查詢,不包含子查詢或 union
primary:包含復雜的子查詢,最外層查詢標記為該值
subquery:在 select 或 where 包含子查詢,被標記為該值
derived:在 from 串列中包含的子查詢被標記為該值,MySQL 會遞回執行這些子查詢,把結果放在臨時表
union:若第二個 select 出現在 union 之后,則被標記為該值,若 union 包含在 from 的子查詢中,外層 select 被標記為 derived    
union result:從 union 表獲取結果的 select

3. table:顯示該行資料是關于哪張表

4. partitions:匹配的磁區

5. type:表的連接型別,其值,性能由高到底排列如下:

system:表只有一行記錄,相當于系統表
const:通過索引一次就找到,只匹配一行資料
eq_ref:唯一性索引掃描,對于每個索引鍵,表中只有一條記錄與之匹配,常用于主鍵或唯一索引掃描
ref:非唯一性索引掃描,回傳匹配某個單獨值的所有行,用于=、< 或 > 運算子帶索引的列
range:只檢索給定范圍的行,使用一個索引來選擇行,一般使用between、>、<情況
index:只遍歷索引樹
ALL:全表掃描,性能最差

注:前5種情況都是理想情況的索引使用情況,通常優化至少到range級別,最好能優化到 ref

6. possible_keys:指出 MySQL 使用哪個索引在該表找到行記錄,如果該值為 NULL,說明沒有使用索引,可以建立索引提高性能

7. key:顯示 MySQL 實際使用的索引,如果為 NULL,則沒有使用索引查詢

8. key_len:表示索引中使用的位元組數,通過該列計算查詢中使用的索引的長度,在不損失精確性的情況下,長度越短越好 顯示的是索引欄位的最大長度,并非實際使用長度

9. ref:顯示該表的索引欄位關聯了哪張表的哪個欄位

10. rows:根據表統計資訊及選用情況,大致估算出找到所需的記錄或所需讀取的行數,數值越小越好

11. filtered:回傳結果的行數占讀取行數的百分比,值越大越好

12. extra: 包含不合適在其他列中顯示但十分重要的額外資訊,常見的值如下:

using filesort:說明 MySQL 會對資料使用一個外部的索引排序,而不是按照表內的索引順序進行讀取,出現該值,應該優化 SQL
using temporary:使用了臨時表保存中間結果,MySQL 在對查詢結果排序時使用臨時表,常見于排序 order by 和分組查詢 group by,出現該值,應該優化 SQL 
using index:表示相應的 select 操作使用了覆寫索引,避免了訪問表的資料行,效率不錯
using where:where 子句用于限制哪一行
using join buffer:使用連接快取
distinct:發現第一個匹配后,停止為當前的行組合搜索更多的行

注意:出現前 2 個值,SQL 陳述句必須要優化,

5.2 方式二:profiling

使用 profiling 命令可以了解 SQL 陳述句消耗資源的詳細資訊(每個執行步驟的開銷),

5.2.1 查看 profile 開啟情況

select @@profiling;

回傳結果:

mysql> select @@profiling;
+-------------+
| @@profiling |
+-------------+
|           0 |
+-------------+
1 row in set, 1 warning (0.00 sec)

0 表示關閉狀態,1 表示開啟

# 5.2.2 啟用 profile

set profiling = 1;  

回傳結果:

mysql> set profiling = 1;  
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> select @@profiling;
+-------------+
| @@profiling |
+-------------+
|           1 |
+-------------+
1 row in set, 1 warning (0.00 sec)

在連接關閉后,profiling 狀態自動設定為關閉狀態,

# 5.2.3 查看執行的 SQL 串列

show profiles;

回傳結果:

mysql> show profiles;
+----------+------------+------------------------------+
| Query_ID | Duration   | Query                        |
+----------+------------+------------------------------+
|        1 | 0.00062925 | select @@profiling           |
|        2 | 0.00094150 | show tables                  |
|        3 | 0.00119125 | show databases               |
|        4 | 0.00029750 | SELECT DATABASE()            |
|        5 | 0.00025975 | show databases               |
|        6 | 0.00023050 | show tables                  |
|        7 | 0.00042000 | show tables                  |
|        8 | 0.00260675 | desc role                    |
|        9 | 0.00074900 | select name,is_key from role |
+----------+------------+------------------------------+
9 rows in set, 1 warning (0.00 sec)

該命令執行之前,需要執行其他 SQL 陳述句才有記錄,

5.2.4 查詢指定 ID 的執行詳細資訊

show profile for query Query_ID;

回傳結果:

mysql> show profile for query 9;
+----------------------+----------+
| Status               | Duration |
+----------------------+----------+
| starting             | 0.000207 |
| checking permissions | 0.000010 |
| Opening tables       | 0.000042 |
| init                 | 0.000050 |
| System lock          | 0.000012 |
| optimizing           | 0.000003 |
| statistics           | 0.000011 |
| preparing            | 0.000011 |
| executing            | 0.000002 |
| Sending data         | 0.000362 |
| end                  | 0.000006 |
| query end            | 0.000006 |
| closing tables       | 0.000006 |
| freeing items        | 0.000011 |
| cleaning up          | 0.000013 |
+----------------------+----------+
15 rows in set, 1 warning (0.00 sec)

每行都是狀態變化的程序以及它們持續的時間,Status 這一列和 show processlist 的 State 是一致的,因此,需要優化的注意點與上文描述的一樣,

其中,Status 欄位的值同樣可以參考末尾鏈接,

5.2.5 獲取 CPU、 Block IO 等資訊

show profile block io,cpu for query Query_ID;

show profile cpu,block io,memory,swaps,context switches,source for query Query_ID;

show profile all for query Query_ID;

六、優化手段

主要以查詢優化、索引使用和表結構設計方面進行講解,

6.1 查詢優化

  1. 避免 SELECT *,需要什么資料,就查詢對應的欄位,

  2. 小表驅動大表,即小的資料集驅動大的資料集,如:以 A,B 兩表為例,兩表通過 id 欄位進行關聯,

當 B 表的資料集小于 A 表時,用 in 優化 exist;使用 in ,兩表執行順序是先查 B 表,再查 A 表
select * from A where id in (select id from B)

當 A 表的資料集小于 B 表時,用 exist 優化 in;使用 exists,兩表執行順序是先查 A 表,再查 B 表
select * from A where exists (select 1 from B where B.id = A.id)
  1. 一些情況下,可以使用連接代替子查詢,因為使用 join,MySQL 不會在記憶體中創建臨時表,

  2. 適當添加冗余欄位,減少表關聯,

  3. 合理使用索引(下文介紹),如:為排序、分組欄位建立索引,避免 filesort 的出現,

6.2 索引使用

6.2.1 適合使用索引的場景

  1. 主鍵自動創建唯一索引

  2. 頻繁作為查詢條件的欄位

  3. 查詢中與其他表關聯的欄位

  4. 查詢中排序的欄位

  5. 查詢中統計或分組欄位

6.2.2 不適合使用索引的場景

  1. 頻繁更新的欄位

  2. where 條件中用不到的欄位

  3. 表記錄太少

  4. 經常增刪改的表

  5. 欄位的值的差異性不大或重復性高

6.2.3 索引創建和使用原則

  1. 單表查詢:哪個列作查詢條件,就在該列創建索引

  2. 多表查詢:left join 時,索引添加到右表關聯欄位;right join 時,索引添加到左表關聯欄位

  3. 不要對索引列進行任何操作(計算、函式、型別轉換)

  4. 索引列中不要使用 !=,<> 非等于

  5. 索引列不要為空,且不要使用 is null 或 is not null 判斷

  6. 索引欄位是字串型別,查詢條件的值要加’'單引號,避免底層型別自動轉換

違背上述原則可能會導致索引失效,具體情況需要使用 explain 命令進行查看

6.2.4 索引失效情況

除了違背索引創建和使用原則外,如下情況也會導致索引失效:

  1. 模糊查詢時,以 % 開頭

  2. 使用 or 時,如:欄位1(非索引)or 欄位2(索引)會導致索引失效,

  3. 使用復合索引時,不使用第一個索引列,

index(a,b,c) ,以欄位 a,b,c 作為復合索引為例:

陳述句索引是否生效
where a = 1是,欄位 a 索引生效
where a = 1 and b = 2是,欄位 a 和 b 索引生效
where a = 1 and b = 2 and c = 3是,全部生效
where b = 2 或 where c = 3
where a = 1 and c = 3欄位 a 生效,欄位 c 失效
where a = 1 and b > 2 and c = 3欄位 a,b 生效,欄位 c 失效
where a = 1 and b like ‘xxx%’ and c = 3欄位 a,b 生效,欄位 c 失效

6.3 資料庫表結構設計

6.3.1 選擇合適的資料型別

  1. 使用可以存下資料最小的資料型別

  2. 使用簡單的資料型別,int 要比 varchar 型別在mysql處理簡單

  3. 盡量使用 tinyint、smallint、mediumint 作為整數型別而非 int

  4. 盡可能使用 not null 定義欄位,因為 null 占用4位元組空間

  5. 盡量少用 text 型別,非用不可時最好考慮分表

  6. 盡量使用 timestamp 而非 datetime

  7. 單表不要有太多欄位,建議在 20 以內

6.3.2 表的拆分

當資料庫中的資料非常大時,查詢優化方案也不能解決查詢速度慢的問題時,我們可以考慮拆分表,讓每張表的資料量變小,從而提高查詢效率,

1. 垂直拆分:將表中多個列分開放到不同的表中,例如用戶表中一些欄位經常被訪問,將這些欄位放在一張表中,另外一些不常用的欄位放在另一張表中, 插入資料時,使用事務確保兩張表的資料一致性,

2. 水平拆分:按照行進行拆分,例如用戶表中,使用用戶ID,對用戶ID取10的余數,將用戶資料均勻的分配到0~9的10個用戶表中,查找時也按照這個規則查詢資料,

6.3.3 讀寫分離

一般情況下對資料庫而言都是“讀多寫少”,換言之,資料庫的壓力多數是因為大量的讀取資料的操作造成的,我們可以采用資料庫集群的方案,使用一個庫作為主庫,負責寫入資料;其他庫為從庫,負責讀取資料,這樣可以緩解對資料庫的訪問壓力,

七、服務器引數調優

7.1 記憶體相關

sort_buffer_size 排序緩沖區記憶體大小

join_buffer_size 使用連接緩沖區大小

read_buffer_size 全表掃描時分配的緩沖區大小

7.2 IO 相關

Innodb_log_file_size 事務日志大小

Innodb_log_files_in_group 事務日志個數

Innodb_log_buffer_size 事務日志緩沖區大小

Innodb_flush_log_at_trx_commit 事務日志重繪策略,其值如下:

0:每秒進行一次 log 寫入 cache,并 flush log 到磁盤

1:在每次事務提交執行 log 寫入 cache,并 flush log 到磁盤

2:每次事務提交,執行 log 資料寫到 cache,每秒執行一次 flush log 到磁盤

7.3 安全相關

expire_logs_days 指定自動清理 binlog 的天數

max_allowed_packet 控制 MySQL 可以接收的包的大小

skip_name_resolve 禁用 DNS 查找

read_only 禁止非 super 權限用戶寫權限

skip_slave_start 級你用 slave 自動恢復

### 7.4 其他

max_connections 控制允許的最大連接數

tmp_table_size 臨時表大小

max_heap_table_size 最大記憶體表大小

筆者并沒有使用這些引數對 MySQL 服務器進行調優,具體詳情介紹和性能效果請參考文章末尾的資料或另行百度,

八、硬體選購和引數優化

硬體的性能直接決定 MySQL 資料庫的性能瓶頸,直接決定 MySQL 資料庫的運行資料和效率,

作為軟體開發程式員,我們主要關注軟體方面的優化內容,以下硬體方面的優化作為了解即可

8.1 記憶體相關

記憶體的 IO 比硬碟的速度快很多,可以增加系統的緩沖區容量,使資料在記憶體停留的時間更長,以減少磁盤的 IO

8.2 磁盤 I/O 相關

  1. 使用 SSD 或 PCle SSD 設備,至少獲得數百倍甚至萬倍的 IOPS 提升

  2. 購置陣列卡同時配備 CACHE 及 BBU 模塊,可以明顯提升 IOPS

  3. 盡可能選用 RAID-10,而非 RAID-5

### 8.3 配置 CUP 相關

在服務器的 BIOS 設定中,調整如下配置:

  1. 選擇 Performance Per Watt Optimized(DAPC)模式,發揮 CPU 最大性能

  2. 關閉 C1E 和 C States 等選項,提升 CPU 效率

  3. Memory Frequency(記憶體頻率)選擇 Maximum Performance

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/298311.html

標籤:其他

上一篇:線上SpringCloud網關呼叫微服務跨機房了,咋整?

下一篇:計劃在2021年進行回應式開發?但不確定應該選擇哪種技術來快速且低成本的開發應用程式?一文給你解決問題

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • 2023年最新微信小程式抓包教程

    01 開門見山 隔一個月發一篇文章,不過分。 首先回顧一下《微信系結手機號資料庫被脫庫事件》,我也是第一時間得知了這個訊息,然后跟蹤了整件事情的經過。下面是這起事件的相關截圖以及近日流出的一萬條資料樣本: 個人認為這件事也沒什么,還不如關注一下之前45億快遞資料查詢渠道疑似在近日復活的訊息。 訊息是 ......

    uj5u.com 2023-04-20 08:48:24 more
  • web3 產品介紹:metamask 錢包 使用最多的瀏覽器插件錢包

    Metamask錢包是一種基于區塊鏈技術的數字貨幣錢包,它允許用戶在安全、便捷的環境下管理自己的加密資產。Metamask錢包是以太坊生態系統中最流行的錢包之一,它具有易于使用、安全性高和功能強大等優點。 本文將詳細介紹Metamask錢包的功能和使用方法。 一、 Metamask錢包的功能 數字資 ......

    uj5u.com 2023-04-20 08:47:46 more
  • vulnhub_Earth

    前言 靶機地址->>>vulnhub_Earth 攻擊機ip:192.168.20.121 靶機ip:192.168.20.122 參考文章 https://www.cnblogs.com/Jing-X/archive/2022/04/03/16097695.html https://www.cnb ......

    uj5u.com 2023-04-20 07:46:20 more
  • 從4k到42k,軟體測驗工程師的漲薪史,給我看哭了

    清明節一過,盲猜大家已經無心上班,在數著日子準備過五一,但一想到銀行卡里的余額……瞬間心情就不美麗了。最近,2023年高校畢業生就業調查顯示,本科畢業月平均起薪為5825元。調查一出,便有很多同學表示自己又被平均了。看著這一資料,不免讓人想到前不久中國青年報的一項調查:近六成大學生認為畢業10年內會 ......

    uj5u.com 2023-04-20 07:44:00 more
  • 最新版本 Stable Diffusion 開源 AI 繪畫工具之中文自動提詞篇

    🎈 標簽生成器 由于輸入正向提示詞 prompt 和反向提示詞 negative prompt 都是使用英文,所以對學習母語的我們非常不友好 使用網址:https://tinygeeker.github.io/p/ai-prompt-generator 這個網址是為了讓大家在使用 AI 繪畫的時候 ......

    uj5u.com 2023-04-20 07:43:36 more
  • 漫談前端自動化測驗演進之路及測驗工具分析

    隨著前端技術的不斷發展和應用程式的日益復雜,前端自動化測驗也在不斷演進。隨著 Web 應用程式變得越來越復雜,自動化測驗的需求也越來越高。如今,自動化測驗已經成為 Web 應用程式開發程序中不可或缺的一部分,它們可以幫助開發人員更快地發現和修復錯誤,提高應用程式的性能和可靠性。 ......

    uj5u.com 2023-04-20 07:43:16 more
  • CANN開發實踐:4個DVPP記憶體問題的典型案例解讀

    摘要:由于DVPP媒體資料處理功能對存放輸入、輸出資料的記憶體有更高的要求(例如,記憶體首地址128位元組對齊),因此需呼叫專用的記憶體申請介面,那么本期就分享幾個關于DVPP記憶體問題的典型案例,并給出原因分析及解決方法。 本文分享自華為云社區《FAQ_DVPP記憶體問題案例》,作者:昇騰CANN。 DVPP ......

    uj5u.com 2023-04-20 07:43:03 more
  • msf學習

    msf學習 以kali自帶的msf為例 一、msf核心模塊與功能 msf模塊都放在/usr/share/metasploit-framework/modules目錄下 1、auxiliary 輔助模塊,輔助滲透(埠掃描、登錄密碼爆破、漏洞驗證等) 2、encoders 編碼器模塊,主要包含各種編碼 ......

    uj5u.com 2023-04-20 07:42:59 more
  • Halcon軟體安裝與界面簡介

    1. 下載Halcon17版本到到本地 2. 雙擊安裝包后 3. 步驟如下 1.2 Halcon軟體安裝 界面分為四大塊 1. Halcon的五個助手 1) 影像采集助手:與相機連接,設定相機引數,采集影像 2) 標定助手:九點標定或是其它的標定,生成標定檔案及內參外參,可以將像素單位轉換為長度單位 ......

    uj5u.com 2023-04-20 07:42:17 more
  • 在MacOS下使用Unity3D開發游戲

    第一次發博客,先發一下我的游戲開發環境吧。 去年2月份買了一臺MacBookPro2021 M1pro(以下簡稱mbp),這一年來一直在用mbp開發游戲。我大致分享一下我的開發工具以及使用體驗。 1、Unity 官網鏈接: https://unity.cn/releases 我一般使用的Apple ......

    uj5u.com 2023-04-20 07:40:19 more