主頁 > 後端開發 > Mysql資料庫優化

Mysql資料庫優化

2020-10-07 11:07:00 後端開發

1.存盤引擎

什么是存盤引擎

存盤引擎:可以看作是資料表存盤資料的一種格式,不同的格式具有的特性也各不相同,
舉例說明:只有InnoDB存盤引擎支持事務、外鍵、行級鎖等特性,而MyISAM則支持壓碩訓制等特性,
存盤引擎的特點:本身是MySQL資料庫服務器的底層組件之一,最大的特點是采用“可插拔”的存盤引擎架構,
“可插拔”的理解:指的是對正在運行的MySQL服務器依然可根據實際需求使用特定陳述句加載(插入,INSTALL PLUGIN陳述句)或卸載(拔出,UNINSTALL PLUGIN陳述句)所需的存盤引擎檔案

存盤引擎的選擇

查看當前支持的存盤引擎
SHOW ENGINES;

執行以上SQL陳述句,運行的結果中含有6個欄位,.
Engine (存盤引擎)、Support (是否支持)
Comment (注釋說明)、Transactions (是否支持事務)
XA (是否支持分布式事務)和Savepoints ( 是否支持事務的保存點設定)

在這里插入圖片描述
在這里插入圖片描述

1. InnoDB存盤引擎

InnoDB存盤引擎:在MySQL 5.7版本中被指定為默認的存盤引擎,

特性:是MySQL中第一個提供外鍵約束的表引擎,尤其對事務處理的能力,是MySQL其他存盤引擎無法與之比擬的,
優勢:用于完成事務、回滾、崩潰修復和多版本并發控制的事務安全處理
缺點:讀寫效率一般

存盤模式
  • 存盤格式:默認InnoDB資料表都共用一個表空間檔案ibdata1,每張資料表都會在對應的資料庫下創建一個與表同名的結構檔案(資料庫/表名.frm)

ibdata1 的位置:通常位于data目錄下,與資料庫檔案處于同級目錄,
ibdata1 的作用:集中存盤資料和索引,

設定資料表的獨立表空間檔案:全域變數innodb_ file_ _per_ table

#查看默認是否共用同一個表空間檔案.
SHOW VARIABLES LIKE 'innodb_file_per_table';
#開啟每個表獨立的表空間檔案
SET GLOBAL innodb_file_per_table=ON;

例:
在這里插入圖片描述

2. MyISAM存盤引擎

MyISAM存盤引擎:在MySQL5.5以前的版本中是MySQL的默認存盤引擎,

特性:是基于ISAM存盤引擎發展起來的,不僅解決了ISAM的很多不足,還增加了很多有用的擴展,例如,資料的全文索引、壓縮與加密、支持復制與備份的恢復等,
優勢:與InnoDB相比,MyISAM的優點是處理速度快
缺點:InnoDB相比,MyISAM的缺點是不支持事務的完整性和并發性

MyISAM資料表的檔案擴展名分別為frm、myd和myi,檔案名與表名相同,

擴展名功能說明
frm用于存盤表的結構
myd用于存盤資料,是MYData的縮寫
myi用于存盤索引,是MYIndex的縮寫

MyISAM表的資料移植非常方便,只需將資料庫下表中對應的3個檔案復制到另一個資料庫下即可,

3. MRG_MYISAM存盤引擎

MRG_MYISAM存盤引擎:相同MyISAM存盤引擎表的集合,也被稱為MERGE,

特性:所有合并的表必須具有相同順序的欄位與索引的應用
優勢:可快速拆分大型只讀表,執行搜索效率更高等,
缺點:索引讀取速度較慢只針對MyISAM存盤引擎的表進行合并、實際應用較少等,

4. MEMORY存盤引擎

MEMORY存盤引擎:在是MySQL中一種特殊的存盤引擎,

特性:在MEMORY存盤引擎的表中,所有資料都保存在記憶體中,一旦程式出錯或服務器斷電都會導致資料的丟失,
優勢:資料的處理速度快
缺點:不適合持久保存資料,而且也不能存盤太大的資料
對讀寫速度快,資料量小、不需要持久保存的臨時資料是理想的選擇,

5. CSV是存盤引擎

CSV是存盤引擎:是采用文本方式存盤資料的一種存盤引擎,資料在檔案中通過逗號分隔保存,

結構:資料表會分為后綴frm(存盤表結構資訊)、csv(存盤表內容)和csm(存盤表的狀態、資料量等元資料)3個檔案存盤,檔案名與資料表名相同,
一是不支持索引和磁區,二是表中所有欄位必須含有NOT NULL屬性

6. ARCHIVE存盤引擎

ARCHIVE存盤引擎:適合保存數量龐大、長期維護但很少被訪問的資料,

特性:資料存盤時會用zlib壓縮庫進行壓縮,在記錄被請求時會實時進行解壓,
提示: ARCHIVE存盤引擎僅僅支持查詢和插入操作,并且因不支持資料索引,查詢效率較低,

7. BLACKHOLE存盤引擎

BLACKHOLE存盤引擎:被稱為“黑洞”存盤引擎,

特性:寫入的資料都會消失,就像被“黑洞”吞噬了一樣,
作用:利用此特性可以將其作為轉發器或過濾器
舉例:將主服務器中的大量資料經過過濾后搬到從服務器,可將BL ACKHOLE的資料表作為過濾器使用,且不會保存任何資料,但是會在二進制日志中記錄下所有SQL陳述句,然后可復制并執行這些陳述句,將結果保存到從服務器中,

8. PERFORMANCE_SCHEMA存盤引擎

PERFORMANCE_SCHEMA存盤引擎: MySQL .5.7中performance_ schema資料庫中所有資料表的存盤引擎,

特性:用戶不能為資料表創建此型別的存盤引擎,
作用:主要用于收集資料庫服務器性能引數

9. FEDERATED存盤引擎

FEDERATED存盤引擎:默認情況下在MySQL中不可用,

啟動:利用“–federated"選項,
特性:創建從遠程MySQL服務器訪問資料的表,本地的FEDERATED表只保存結構資訊(后綴為frm),遠程服務器同時要保存結構資訊和資料檔案,所有的增刪改查操作都通過訪問遠程服務器后,才將結果回傳給本地的服務器,

2.索引

1. 索引概述

索引:是一種特殊的資料結構,可以看做是利用MySQL提供的語法將資料表中的某個或某些欄位與記錄的位置建立一一個對應的關系,并按照一定的順序排序好,
且的:就是為了快速定位指定資料的位置,

2. 索引分類

普通索引:是MySQL 中的基本索引型別,使用KEYINDEX定義,不需要添加任何限制條件,作用是加快對資料的訪問速度,
唯一性索引:由UNIQUE INDEX定義,創建唯一性索引的欄位需要添加唯一性約束,用于防止用戶添加重復的值,
主鍵索引:由PRIMARY KEY定義的一種特殊的唯一性索引, 用于根據主鍵自身的唯一性標識每條記錄,防止添加主鍵索引的欄位值重復或為NULL,

  • 若在InnoDB表中資料保存的順序與主鍵索引欄位的順序一致時,可將這種主鍵索引稱為“聚簇索引”,一般聚簇索引指的都是表的主鍵
  • 一張資料表中只能有一個聚簇索引,

全文索引:由FULLTEXT INDEX定義,用于根據查詢字符提高資料量較大的欄位查詢速度,此索引在定義時欄位型別必須是CHAR、VARCHAR或TEXT中的一種,在MySQL 5.7版本中,僅MylSAM和InnoDB存盤引擎支持全文索引
空間索引:由SPATIAL INDEX定義在空間資料型別欄位上的索引,提高系統獲取空間資料的效率,僅MyISAM和InnoDB存盤引擎支持空間索引,還要保證創建索引的欄位不能為空,

根據創建索引的欄位個數,還可以將它們分為單列索引復合索引

  • 單列索引:指在表中單個欄位上創建的索引,可以是普通索引、唯一索引、主鍵索引或者全文索引,只要保證該索引對應表中一個欄位即可
  • 復合索引:是在表的多個欄位上創建一個索引,且只有在查詢條件中使用了這些欄位中的第一個欄位時,該索引才會被使用,

3. 索引的操作

創建索引
  • CREATE TABLE方式,與資料表同時創建,
#方式1: CREATE TABLE創建資料表時添加索引
CREATE TABLE資料表名(
欄位名資料型別[約束條件]
...
PRIMARY KEY [索引型別] (欄位串列)[索引選項],
{INDEX|KEY} [索引名稱] [索引型別] (欄位串列)[索引選項],
UNIQUE [INDEXIKEY] [索引名稱] [索引型別] (欄位串列)[索引選項],
{FULLTEXT|SPATIAL} [INDEX|KEY] [索引名稱] (欄位串列)[索引選項]
)[表選項];
  • ALTER TABLE方式,對已創建的資料表進行添加,
#方式2: ALTER TABLE向已創建的資料表添加索引
ALTER TABLE 資料表名
ADD PRIMARY KEY[索引型別] (欄位串列) [索引選項]
|ADD {INDEX|KEY} [索引名稱] [索引型別] (欄位串列) [索引選項]
|ADD UNIQUE [INDEX|KEY] [索引名稱] [索引型別] (欄位串列) [索引選項]
|ADD FULLTEXT [INDEX|KEY] [索引名稱] (欄位串列)[索引選項]
IADD SPATIAL [INDEX|KEY] [索引名稱] (欄位串列)[索引選項], ...;
  • CREATE INDEX方式,對已創建的資料表進行添加,不能添加主鍵索引,
#方式3: CREATE INDEX向已創建的資料表添加索引.
CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX 索引名稱
[索引型別] ON 資料表名(欄位串列)[索引選項][演算法選項|鎖選項]

索引可設定選項

索引選項語法
索引型別USING {BTREE | HASH}
欄位串列欄位[(長度)[ASC | DESC]]
索引選項KEY_BLOCK_SIZE [=]值|索引型別| WITH PARSER決議器插件名| COMMENT ‘描述資訊’
演算法選項ALGORITHM [=] {DEFAULT|INPLACE|COPY}
鎖選項LOCK [=] {DEFAULT|NONE|SHARED\IEXCLUSIVE}

主鍵索引不能設定索引名稱,其他索引的名稱也可以省略,默認使用建立索引的欄位表示,復合索引則使用第一個欄位的名稱作為索引名,

索引欄位資訊
欄位名稱描述
Non_unique索引是否可以重復,0表示不可以,1表示可以
Key_name索引的名字,如果索引是主鍵索引,則它的名字為PRIMARY
Seq_in_index建立索引的欄位序號值,默認從1開始
Column_name建立索引的欄位
Collation索引欄位是否有排序,A表示排序,NULL表示沒有排序
Cardinality計算MySQL連接時使用索引的可能性(精確度不高),值越大,可能性越高
Sub_part前綴索引的長度,如3,若欄位值都被索引則為NULL
Index_type索引型別,可選值有BTREE、FULLTEXT、 HASH、RTREE
Comment索引欄位的注釋資訊
Index_comment創建索引時添加的注釋資訊
欄位名稱描述
id查詢識別符號,默認從1開始,若使用了聯合查詢,則該值依次遞增,聯合查詢結果對應的該值為NULL
select_ type操作型別,如DELETE、UPDATE等,但是當執行SEL ECT陳述句時,它的值有多種,如SIMPLE表示不需聯合查詢或簡單的子查詢,
table輸出資料的表
partitions匹配的磁區
type連接的型別,如const使用了主鍵索引或唯一性索引,ref表示使用前綴索引或條件中含有運算子“=”或“<=>”等
key_ len索引欄位的長度
ref表示哪些欄位或常量與索引比較了比較,如const表示常量與索引進行了比較
rows預計需要檢索的記錄數
filtered按條件過濾的百分比
Extra附加資訊,如Using index表示使用了索引覆寫

所謂索引覆寫指的是查詢的欄位恰好是索引的一部分或與索引
完全一致,那么查詢只需要在索引區上進行,不需要到資料區
檢索資料的情況,
這種查詢的的特點是速度非常快,但同時也會增加索引檔案的
大小,只有此索引的使用率盡可能高的情況下,索引覆寫才有
意義,否則,在使用時應該避免此情況的發生,

洗掉索引

主鍵索引在洗掉時,需要考慮該主鍵欄位是否含有AUTO_INCREMENT屬性,若有則需在洗掉主鍵索引前洗掉該屬性,否則程式會報以下的錯誤提示資訊,
在這里插入圖片描述

  • 洗掉含有AUTO INCREMENT屬性的主鍵索引
#洗掉主鍵欄位的AUTO_ INCREMENT屬性
ALTER TABLE 資料表 MODIFY 欄位名欄位型別
#洗掉主鍵索引
ALTER TABLE 資料表 DROP PRIMARY KEYDROP INDEX'PRIMARY' ON 資料表

當使用DROP INDEX洗掉主鍵索引時,其后的PRIMARY由于是MySQL中的保留字,因此必須使用反引號(‘) 包裹,

洗掉命令:

#語法1
ALTER TABLE 資料表 DROP INDEX 索引名
#語法2
DROP INDEX 索引名 ON 資料表 [演算法選項][鎖選項]

例:
在這里插入圖片描述

3.鎖機制

簡單的說,鎖機制就是為了保證多用戶并發操作時,能使被操作的資料資源保持一致性的設計規則,

鎖的分類

表級鎖(如MyISAM、MEMORY存盤引擎)

表級鎖:是MySQL中鎖的作用范圍( 鎖的粒度)最大的一種鎖,
鎖定范圍:是用戶操作資源所在的整個資料表,
優勢:有效的避免了死鎖的發生,且具有加鎖速度快、消耗資源小的特點,
缺陷:因其鎖定的粒度大,在并發操作時發生鎖沖突的概率也大,

行級鎖(如InnoDB存盤引擎特殊)

行級鎖:是MySQL 中鎖的作用范圍最小的一種鎖,
鎖定范圍:僅鎖定用戶操作所涉及的記錄資源,
優勢:能減少鎖定資源的競爭,較高并發處理能力,提升系統的整體性能,
缺陷:因其鎖定的粒度過小,每次加鎖和解鎖所消耗的資源也會更多,發生死鎖的可能性更高,

根據鎖在MySQL中的狀態也可將其分為“隱式”與“顯式”:

  • “隱式”鎖指的是MySQL服務器本身對資料資源的爭用進行管理,它完全由服務器自動執行,
  • “顯式”鎖指的是用戶根據實際需求,對操作的資料顯式的添加鎖,同樣在使用完資料資源后也需要用戶對其進行解鎖,

表級鎖

表級鎖:根據操作的不同可以分為讀鎖和寫鎖,
讀鎖:表示用戶讀取(如SELECT查詢)資料資源時添加的鎖,其他用戶不可修改或增加資料資源,但是可以讀取該資料資源,因此讀鎖也可稱為共享鎖
寫鎖:表示用戶對資料資源執行寫(如INSERT、UPDATE、DELETE等)操作時添加的鎖,除了當前添加寫鎖的用戶外,其他用戶都不能對其進行讀/寫操作,因此寫鎖也可以稱為排他鎖獨占鎖

MyISAM存盤引擎表:是MySQL 資料庫中最典型的表級鎖,
“隱式”讀的表級鎖:當用戶對MyISAM存盤引擎表執行SELECT查詢操作前,服務器會“自動”地為其添加-一個表級的讀鎖,
“隱式”寫的表級鎖:執行INSERT、 UPDATE、DELETE等寫操作前,服務器會“自動”地為其添加一個表級的寫鎖,

“隱式”讀的表級鎖與“隱式”寫的表級鎖添加的優先級順序:

  • 默認服務器“自動”添加“隱式”鎖時,表的更新操作優先于表的查詢操作,.
  • 添加寫鎖時,若表中沒有任何鎖則添加,否則將其插入到寫鎖等待的佇列中,
  • 添加讀鎖時,若表中沒有寫鎖則添加,否則將其插入到讀鎖等待的佇列中,

表級鎖語法:

LOCK TABLES 資料表名 READ [LOCAL]| WRITE,...
  • LOCK TABLES可以同時鎖定多張資料表,
  • READ表示表級的讀鎖,添加此鎖的用戶可讀但不能寫,其他用戶可以讀取,執行寫操作會進入等待佇列,
  • WRITE表示表級的寫鎖,添加此鎖的用戶可執行讀/寫操作,在釋放鎖之前,不允許其他用戶訪問與操作,

表級鎖的問題:鎖定的粒度大,多用戶訪問會造成鎖競爭,降低并發處理能力,
從資料庫優化的角度來考慮:盡量減少表級鎖定時間,提高多用戶的并發能力,.
如何釋放“顯式”表級鎖: UNLOCK TABLES陳述句

行級鎖

InnoDB存盤引擎的鎖機制相對于MyISAM存盤引擎的鎖復雜一些,
InnoDB存盤引擎既有表級鎖又有行級鎖
InnoDB表級鎖的應用與MyISAM表級鎖的相同,
“隱式”行級排他鎖:當用戶對InnoDB存盤引擎表執行INSERT、UPDATE、DELETE等寫操作前,服務器會“自動”地為通過索引條件檢索的記錄添加行級排他鎖,
“隱式”行級排他鎖要如何解鎖:直到操作陳述句執行完畢,服務器再“自動”地為其解鎖,
“隱式”行級排他鎖的生命周期:陳述句的執行時間可以看作是“隱式”行級鎖的生命周期,且該生命周期的持續時間–般都比較短暫,
延長“隱式”行級排他鎖的生命周期:通常情況下,若要增加行級鎖的生命周期,最常使用的方式是事務處理,讓其在事務提交或回滾后再釋放行級鎖,使行級鎖的生命周期與事務的相同,

對于InnoDB表來說,若要保證當前事務中查詢出的資料不會被其他事務更新或洗掉,利用普通的SELECT陳述句是無法辦到的,此時需要利用MySQL提供的“鎖定讀取”的方式為查詢操作顯式的添加行級鎖,

SELECT 陳述句 FOR UPDATE|LOCK IN SHARE MODE
# FOR UPDATE:表示在查詢時添加行級排他鎖
# LOCK IN SHARE MODE:表示在查詢時添加行級共享鎖

用戶在向InnoDB表顯式添加行級鎖時,InnoDB存盤引擎首先會“自動”地向此表添加一個意向鎖,然后再添加行級鎖

  • 意向鎖是一個隱式的表級鎖,多個意向鎖之間不會產生沖突且互相兼容
  • 意向鎖是由MySQL服務器根據行級鎖是共享鎖還是排他鎖,自動添加意向共享鎖或意向排他鎖,不能人為干預
  • 意向鎖的作用:就是標識表中的某些記錄正在被鎖定或其他用戶將要鎖定表中的某些記錄,相對行級鎖,意向鎖的鎖定粒度更大,用于在行級鎖中添加表級鎖時判斷它們之間是否能夠互相兼容
  • 好處:就是大大節約了存盤引擎對鎖處理的性能,更加方便的解決了行級鎖與表級鎖之間的沖突,

表級的共享/排他鎖與意共享排他鎖之間的兼容性關系

表級的共享/排他鎖與意共享排他鎖之間的兼容性關系

默認當InnoDB處于REPEATABLE READ (可重復讀)的隔離級別時,行級鎖實際上是一個next-key鎖,它是由間隙鎖(gap lock)和記錄鎖(record lock)組成,

  • 記錄鎖(record lock)就是前面講解的行鎖,
  • 間隙鎖(gap lock)指的是在記錄索引之間的間隙、負無窮到第1個索引記錄之間或最后1個索引記錄到正無窮之間添加的鎖,

4.分表技術

分表技術: 將單張資料表根據不同的需求進行拆分,從而達到分散單表壓力的目的,提升資料庫的訪問性能,

分表分類

水平分表:將一張資料表中的全部記錄分別存盤到多張資料表中,因此水平分表在創建時,必須保證各資料表涉及到的欄位全部相同
水平分表使單張表的資料能夠保持在一定的量級,

  • 優勢:在操作時又因其表結構完全相同,只需增加獲取對應分表名稱的運算,就可以提高系統的穩定性和負載能力,
  • 缺點:水平分表使得資料分散存盤,加大了資料維護難度,

垂直分表:將同一個業務的不同欄位分別存盤到多張資料表中,因此垂直分表在創建時,各資料表僅通過一個欄位進行連接,其他欄位都不相同

  • 垂直分表后業務邏輯更加的清晰,方便資料進行整合與擴展,還可以根據實際需求實作動靜分離,為各分表選擇不同的存盤引擎(如查詢操作多可以使用MyISAM等),
  • 缺點:需要管理冗余欄位、查詢所有資料需要進行連接

5.磁區技術

磁區概述

磁區技術:就是在操作資料表時可以根據給定的演算法,將資料在邏輯上分到多個區域中存盤,在磁區中還可以設定子磁區,將資料存放到更加具體的區域內,

  • 磁區技術可以使一張資料表中的資料存盤在不同的物理磁盤中,相比單個磁盤或檔案系統能夠存盤更多的資料,實作更高的查詢吞吐量
  • 若在WHERE子句中包含磁區條件,系統只需掃描相關的一個或多個磁區而不用全表掃描,從而提高查詢效率,
  • 同一個磁區表的所有磁區必須使用相同存盤引擎,當建表時未指定存盤引擎,在創建磁區時必須設定存盤引擎,

磁區操作

CREATE TABLE 資料表名稱
[(欄位與索引串列)][表選項]
PARTITION BY 磁區演算法(磁區欄位)[PARTITIONS磁區數量]
[SUBPARTITION BY子磁區演算法(子磁區欄位)[SUBPARTITIONS子磁區數量]]
[(
PARTITION磁區名[VALUES][其他選項][(SUBPARTITION 子磁區名 [其他選項])],
...
)];

磁區是在表選項后添加PARTITION BY實作,
一個表最多僅可以創建1024個磁區,
磁區演算法有4種,分別為LIST、RANGE、HASH和KEY,

創建list磁區

在這里插入圖片描述

磁區創建完成后,會在資料檔案data/mydb目錄下看到對應的磁區資料檔案
p_list#p#p1.idb
p_list#p#p2.idb

創建hash磁區

在這里插入圖片描述

使用HASH演算法為p_hash表創建了3個磁區,磁區檔案的序號默認從0開始,當有多個磁區時依次遞增加1,例如,以上創建的磁區序號依次為0、1和2,

#已創建的資料表沒有創建磁區,添加磁區的方式
ALTER TABLE資料表名稱PARTITION BY磁區演算法...;
#已創建的資料表含有磁區,添加磁區的方式
#LIST或RANGE磁區
ALTER TABLE資料表名稱ADD PARTITION (磁區選項,..;, .
#HASH或KEY磁區
ALTER TABLE資料表名稱PARTITIONS 數量;

在這里插入圖片描述

#洗掉HASH、KEY磁區
ALTER TABLE資料表名稱COALESCE PARTITION數量;
#洗掉RANGE、LIST磁區
ALTER TABLE資料表名稱DROP PARTITION磁區名稱; .
  • 洗掉HASH與KEY演算法磁區時,會將該磁區內的資料重新整合到剩余的磁區,
  • 洗掉RANGE與LIST演算法磁區時,會同時洗掉磁區中保存的資料,
  • 當資料表的磁區僅剩一個時,不能通過以上的方式洗掉,只能利用DROP TABLE的方式洗掉表,

若在開發中僅要清空各磁區表中的資料,不洗掉對應的磁區檔案,可以使用以下的陳述句實作,

ALTER TABLE 資料表名稱 TRUNCATE PARTITION{磁區名稱|ALL}

6.資料碎片與維護

在MySQL資料庫中,DELETE洗掉一條記錄時,僅洗掉了資料表中保存的資料,而記錄占用的存盤空間會被保留
長期洗掉資料、添加資料的程序中,索引檔案和資料檔案都將產生“空洞”,形成很多不連續的碎片,造成資料表占用空間變大,但表中記錄數卻很少的情況發生,

修復資料表的資料及索引碎片時,會把所有的資料檔案重新整理一遍,因此,若資料表的記錄數比較大,也會消耗一定的資源,所以不能頻繁的對資料碎片進行維護,可根據實際的情況按周、月或季度等進行操作,.

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

標籤:java

上一篇:【學習筆記】學習Docker,看完這篇超詳細的教程就足夠了

下一篇:用Android設備呼叫CuraEngine對3D列印進行切片

標籤雲
其他(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)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more