【夯實Mysql基礎】MySQL性能優化的21個最佳實踐 和 mysql使用索引

来源:http://www.cnblogs.com/aiweixiao/archive/2016/12/22/6212357.html
-Advertisement-
Play Games

本文地址 分享提綱: 1.為查詢緩存優化你的查詢 2. EXPLAIN 你的 SELECT 查詢 3. 當只要一行數據時使用 LIMIT 1 4. 為搜索欄位建索引 5. 在Join表的時候使用相當類型的例,並將其索引 6. 千萬不要 ORDER BY RAND() 7. 避免 SELECT * 8 ...


本文地址

分享提綱:

1.為查詢緩存優化你的查詢

  2. EXPLAIN 你的 SELECT 查詢

  3. 當只要一行數據時使用 LIMIT 1

  4. 為搜索欄位建索引

  5. 在Join表的時候使用相當類型的例,並將其索引

  6. 千萬不要 ORDER BY RAND()

  7. 避免 SELECT *

  8. 永遠為每張表設置一個ID

  9. 使用 ENUM 而不是 VARCHAR

  10. 從 PROCEDURE ANALYSE() 取得建議

  11. 儘可能的使用 NOT NULL

  12. Prepared Statements

  13. 無緩衝的查詢

  14. 把IP地址存成 UNSIGNED INT

  15.  固定長度的表會更快

  16. 垂直分割

  17. 拆分大的 DELETE 或 INSERT 語句

  18. 越小的列會越快

  19. 選擇正確的存儲引擎

  20. 使用一個對象關係映射器(Object Relational Mapper)

  21. 小心“永久鏈接”

  22. mysql強制索引和禁止某個索引
分享提綱

 

 

  今天,資料庫的操作越來越成為整個應用的性能瓶頸了,這點對於Web應用尤其明顯。 關於資料庫的性能,這並不只是DBA才需要擔心的事,而這更是我 們程式員需要去關註的事情。當我們去設計資料庫表結構,對操作資料庫時(尤其是查表時的SQL語句),我們都需要註意數據操作的性能。這裡,我們不會講過 多的SQL語句的優化,而只是針對MySQL這一Web應用最多的資料庫。希望下麵的這些優化技巧對你有用。

 

  1. 為查詢緩存優化你的查詢

大多數的MySQL伺服器都開啟了查詢緩存。這是提高性最有效的方法之一,而且這是被MySQL的資料庫引擎處理的。當有很多相同的查詢被執行了多次的時候,這些查詢結果會被放到一個緩存中,這樣,後續的相同的查詢就不用操作表而直接訪問緩存結果了。

這裡最主要的問題是,對於程式員來說,這個事情是很容易被忽略的。因為,我們某些查詢語句會讓MySQL不使用緩存。請看下麵的示例:

 

 

上面兩條SQL語句的差別就是 CURDATE() ,MySQL的查詢緩存對這個函數不起作用。所以,像 NOW() 和 RAND() 或是其它的諸如此類的SQL函數都不會開啟查詢緩存,因為這些函數的返回是會不定的易變的。所以,你所需要的就是用一個變數來代替MySQL的函數,從而 開啟緩存。

  2. EXPLAIN 你的 SELECT 查詢

使用 EXPLAIN 關鍵字可以讓你知道MySQL是如何處理你的SQL語句的。這可以幫你分析你的查詢語句或是表結構的性能瓶頸。

EXPLAIN 的查詢結果還會告訴你你的索引主鍵被如何利用的,你的數據表是如何被搜索和排序的……等等,等等。

挑一個你的SELECT語句(推薦挑選那個最複雜的,有多表聯接的),把關鍵字EXPLAIN加到前面。你可以使用phpmyadmin來做這個事。然後,你會看到一張表格。下麵的這個示例中,我們忘記加上了group_id索引,並且有表聯接:

 

當我們為 group_id 欄位加上索引後:

 

 

我們可以看到,前一個結果顯示搜索了 7883 行,而後一個只是搜索了兩個表的 9 和 16 行。查看rows列可以讓我們找到潛在的性能問題。

  3. 當只要一行數據時使用 LIMIT 1

當你查詢表的有些時候,你已經知道結果只會有一條結果,但因為你可能需要去fetch游標,或是你也許會去檢查返回的記錄數。

在這種情況下,加上 LIMIT 1 可以增加性能。這樣一樣,MySQL資料庫引擎會在找到一條數據後停止搜索,而不是繼續往後查少下一條符合記錄的數據。

下麵的示例,只是為了找一下是否有“中國”的用戶,很明顯,後面的會比前面的更有效率。(請註意,第一條中是Select *,第二條是Select 1)

 

 

  4. 為搜索欄位建索引

索引並不一定就是給主鍵或是唯一的欄位。如果在你的表中,有某個欄位你總要會經常用來做搜索,那麼,請為其建立索引吧。

 

 

從上圖你可以看到那個搜索字串 “last_name LIKE ‘a%’”,一個是建了索引,一個是沒有索引,性能差了4倍左右。

另外,你應該也需要知道什麼樣的搜索是不能使用正常的索引的。例如,當你需要在一篇大的文章中搜索一個詞時,如: “WHERE post_content LIKE ‘%apple%’”,索引可能是沒有意義的。你可能需要使用MySQL全文索引 或是自己做一個索引(比如說:搜索關鍵詞或是Tag什麼的)

  5. 在Join表的時候使用相當類型的例,並將其索引

如果你的應用程式有很多 JOIN 查詢,你應該確認兩個表中Join的欄位是被建過索引的。這樣,MySQL內部會啟動為你優化Join的SQL語句的機制。

而且,這些被用來Join的欄位,應該是相同的類型的。例如:如果你要把 DECIMAL 欄位和一個 INT 欄位Join在一起,MySQL就無法使用它們的索引。對於那些STRING類型,還需要有相同的字元集才行。(兩個表的字元集有可能不一樣)

 

  6.千萬不要 ORDER BY RAND()

想打亂返回的數據行?隨機挑一個數據?真不知道誰發明瞭這種用法,但很多新手很喜歡這樣用。但你確不瞭解這樣做有多麼可怕的性能問題。

如果你真的想把返回的數據行打亂了,你有N種方法可以達到這個目的。這樣使用只讓你的資料庫的性能呈指數級的下降。這裡的問題是:MySQL會不得 不去執行RAND()函數(很耗CPU時間),而且這是為了每一行記錄去記行,然後再對其排序。就算是你用了Limit 1也無濟於事(因為要排序)

下麵的示例是隨機挑一條記錄

 

 

  7. 避免 SELECT *

從資料庫里讀出越多的數據,那麼查詢就會變得越慢。並且,如果你的資料庫伺服器和WEB伺服器是兩台獨立的伺服器的話,這還會增加網路傳輸的負載。

所以,你應該養成一個需要什麼就取什麼的好的習慣。

 

 

  8. 永遠為每張表設置一個ID

我們應該為資料庫里的每張表都設置一個ID做為其主鍵,而且最好的是一個INT型的(推薦使用UNSIGNED),並設置上自動增加的AUTO_INCREMENT標誌。

就算是你 users 表有一個主鍵叫 “email”的欄位,你也別讓它成為主鍵。使用 VARCHAR 類型來當主鍵會使用得性能下降。另外,在你的程式中,你應該使用表的ID來構造你的數據結構。

而且,在MySQL數據引擎下,還有一些操作需要使用主鍵,在這些情況下,主鍵的性能和設置變得非常重要,比如,集群,分區……

在這裡,只有一個情況是例外,那就是“關聯表”的“外鍵”,也就是說,這個表的主鍵,通過若幹個別的表的主鍵構成。我們把這個情況叫做“外鍵”。比 如:有一個“學生表”有學生的ID,有一個“課程表”有課程ID,那麼,“成績表”就是“關聯表”了,其關聯了學生表和課程表,在成績表中,學生ID和課 程ID叫“外鍵”其共同組成主鍵。

  9. 使用 ENUM 而不是 VARCHAR

ENUM 類型是非常快和緊湊的。在實際上,其保存的是 TINYINT,但其外表上顯示為字元串。這樣一來,用這個欄位來做一些選項列表變得相當的完美。

如果你有一個欄位,比如“性別”,“國家”,“民族”,“狀態”或“部門”,你知道這些欄位的取值是有限而且固定的,那麼,你應該使用 ENUM 而不是 VARCHAR。

MySQL也有一個“建議”(見第十條)告訴你怎麼去重新組織你的表結構。當你有一個 VARCHAR 欄位時,這個建議會告訴你把其改成 ENUM 類型。使用 PROCEDURE ANALYSE() 你可以得到相關的建議。

  10. 從 PROCEDURE ANALYSE() 取得建議

PROCEDURE ANALYSE() 會讓 MySQL 幫你去分析你的欄位和其實際的數據,並會給你一些有用的建議。只有表中有實際的數據,這些建議才會變得有用,因為要做一些大的決定是需要有數據作為基礎的。

例如,如果你創建了一個 INT 欄位作為你的主鍵,然而並沒有太多的數據,那麼,PROCEDURE ANALYSE()會建議你把這個欄位的類型改成 MEDIUMINT 。或是你使用了一個 VARCHAR 欄位,因為數據不多,你可能會得到一個讓你把它改成 ENUM 的建議。這些建議,都是可能因為數據不夠多,所以決策做得就不夠準。

在phpmyadmin里,你可以在查看表時,點擊 “Propose table structure” 來查看這些建議

 

 

一定要註意,這些只是建議,只有當你的表裡的數據越來越多時,這些建議才會變得準確。一定要記住,你才是最終做決定的人。

  11. 儘可能的使用 NOT NULL

除非你有一個很特別的原因去使用 NULL 值,你應該總是讓你的欄位保持 NOT NULL。這看起來好像有點爭議,請往下看。

首先,問問你自己“Empty”和“NULL”有多大的區別(如果是INT,那就是0和NULL)?如果你覺得它們之間沒有什麼區別,那麼你就不要使用NULL。(你知道嗎?在 Oracle 里,NULL 和 Empty 的字元串是一樣的!)

不要以為 NULL 不需要空間,其需要額外的空間,並且,在你進行比較的時候,你的程式會更複雜。 當然,這裡並不是說你就不能使用NULL了,現實情況是很複雜的,依然會有些情況下,你需要使用NULL值。

 

  12. Prepared Statements

Prepared Statements很像存儲過程,是一種運行在後臺的SQL語句集合,我們可以從使用 prepared statements 獲得很多好處,無論是性能問題還是安全問題。

Prepared Statements 可以檢查一些你綁定好的變數,這樣可以保護你的程式不會受到“SQL註入式”攻擊。當然,你也可以手動地檢查你的這些變數,然而,手動的檢查容易出問題, 而且很經常會被程式員忘了。當我們使用一些framework或是ORM的時候,這樣的問題會好一些。

在性能方面,當一個相同的查詢被使用多次的時候,這會為你帶來可觀的性能優勢。你可以給這些Prepared Statements定義一些參數,而MySQL只會解析一次。

雖然最新版本的MySQL在傳輸Prepared Statements是使用二進位形勢,所以這會使得網路傳輸非常有效率。

當然,也有一些情況下,我們需要避免使用Prepared Statements,因為其不支持查詢緩存。但據說版本5.1後支持了。

在PHP中要使用prepared statements,你可以查看其使用手冊:mysqli 擴展 或是使用資料庫抽象層,如: PDO.

 

 

  13. 無緩衝的查詢

正常的情況下,當你在當你在你的腳本中執行一個SQL語句的時候,你的程式會停在那裡直到沒這個SQL語句返回,然後你的程式再往下繼續執行。你可以使用無緩衝查詢來改變這個行為。

 

mysql_unbuffered_query() 發送一個SQL語句到MySQL而並不像mysql_query()一樣去自動fethch和緩存結果。這會相當節約很多可觀的記憶體,尤其是那些會產生大 量結果的查詢語句,並且,你不需要等到所有的結果都返回,只需要第一行數據返回的時候,你就可以開始馬上開始工作於查詢結果了。

然而,這會有一些限制。因為你要麼把所有行都讀走,或是你要在進行下一次的查詢前調用 mysql_free_result() 清除結果。而且, mysql_num_rows() 或 mysql_data_seek() 將無法使用。所以,是否使用無緩衝的查詢你需要仔細考慮。

  14. 把IP地址存成 UNSIGNED INT

很多程式員都會創建一個 VARCHAR(15) 欄位來存放字元串形式的IP而不是整形的IP。如果你用整形來存放,只需要4個位元組,並且你可以有定長的欄位。而且,這會為你帶來查詢上的優勢,尤其是當 你需要使用這樣的WHERE條件:IP between ip1 and ip2。

我們必需要使用UNSIGNED INT,因為 IP地址會使用整個32位的無符號整形。

而你的查詢,你可以使用 INET_ATON() 來把一個字元串IP轉成一個整形,並使用 INET_NTOA() 把一個整形轉成一個字元串IP。在PHP中,也有這樣的函數 ip2long() 和 long2ip()。

 

 

  15. 固定長度的表會更快

如果表中的所有欄位都是“固定長度”的,整個表會被認為是 “static” 或 “fixed-length”。 例如,表中沒有如下類型的欄位: VARCHAR,TEXT,BLOB。只要你包括了其中一個這些欄位,那麼這個表就不是“固定長度靜態表”了,這樣,MySQL 引擎會用另一種方法來處理。

固定長度的表會提高性能,因為MySQL搜尋得會更快一些,因為這些固定的長度是很容易計算下一個數據的偏移量的,所以讀取的自然也會很快。而如果欄位不是定長的,那麼,每一次要找下一條的話,需要程式找到主鍵。

並且,固定長度的表也更容易被緩存和重建。不過,唯一的副作用是,固定長度的欄位會浪費一些空間,因為定長的欄位無論你用不用,他都是要分配那麼多的空間。

使用“垂直分割”技術(見下一條),你可以分割你的表成為兩個一個是定長的,一個則是不定長的。

  16. 垂直分割

“垂直分割”是一種把資料庫中的表按列變成幾張表的方法,這樣可以降低表的複雜度和欄位的數目,從而達到優化的目的。(以前,在銀行做過項目,見過一張表有100多個欄位,很恐怖)

示例一:在Users表中有一個欄位是家庭地址,這個欄位是可選欄位,相比起,而且你在資料庫操作的時候除了個人信息外,你並不需要經常讀取或是改 寫這個欄位。那麼,為什麼不把他放到另外一張表中呢? 這樣會讓你的表有更好的性能,大家想想是不是,大量的時候,我對於用戶表來說,只有用戶ID,用戶名,口令,用戶角色等會被經常使用。小一點的表總是會有 好的性能。

示例二: 你有一個叫 “last_login” 的欄位,它會在每次用戶登錄時被更新。但是,每次更新時會導致該表的查詢緩存被清空。所以,你可以把這個欄位放到另一個表中,這樣就不會影響你對用戶 ID,用戶名,用戶角色的不停地讀取了,因為查詢緩存會幫你增加很多性能。

另外,你需要註意的是,這些被分出去的欄位所形成的表,你不會經常性地去Join他們,不然的話,這樣的性能會比不分割時還要差,而且,會是極數級的下降。

  17. 拆分大的 DELETE 或 INSERT 語句

如果你需要在一個線上的網站上去執行一個大的 DELETE 或 INSERT 查詢,你需要非常小心,要避免你的操作讓你的整個網站停止相應。因為這兩個操作是會鎖表的,表一鎖住了,別的操作都進不來了。

Apache 會有很多的子進程或線程。所以,其工作起來相當有效率,而我們的伺服器也不希望有太多的子進程,線程和資料庫鏈接,這是極大的占伺服器資源的事情,尤其是記憶體。

如果你把你的表鎖上一段時間,比如30秒鐘,那麼對於一個有很高訪問量的站點來說,這30秒所積累的訪問進程/線程,資料庫鏈接,打開的文件數,可能不僅僅會讓你泊WEB服務Crash,還可能會讓你的整台伺服器馬上掛了。

所以,如果你有一個大的處理,你定你一定把其拆分,使用 LIMIT 條件是一個好的方法。下麵是一個示例:

 

 

  18. 越小的列會越快

對於大多數的資料庫引擎來說,硬碟操作可能是最重大的瓶頸。所以,把你的數據變得緊湊會對這種情況非常有幫助,因為這減少了對硬碟的訪問。

參看 MySQL 的文檔 Storage Requirements 查看所有的數據類型。

如果一個表只會有幾列罷了(比如說字典表,配置表),那麼,我們就沒有理由使用 INT 來做主鍵,使用 MEDIUMINT, SMALLINT 或是更小的 TINYINT 會更經濟一些。如果你不需要記錄時間,使用 DATE 要比 DATETIME 好得多。

當然,你也需要留夠足夠的擴展空間,不然,你日後來乾這個事,你會死的很難看,參看Slashdot的例子(2009年11月06日),一個簡單的ALTER TABLE語句花了3個多小時,因為裡面有一千六百萬條數據。

  19. 選擇正確的存儲引擎

在 MySQL 中有兩個存儲引擎 MyISAM 和 InnoDB,每個引擎都有利有弊。酷殼以前文章《MySQL: InnoDB 還是 MyISAM?》討論和這個事情。

MyISAM 適合於一些需要大量查詢的應用,但其對於有大量寫操作並不是很好。甚至你只是需要update一個欄位,整個表都會被鎖起來,而別的進程,就算是讀進程都 無法操作直到讀操作完成。另外,MyISAM 對於 SELECT COUNT(*) 這類的計算是超快無比的。

InnoDB 的趨勢會是一個非常複雜的存儲引擎,對於一些小的應用,它會比 MyISAM 還慢。他是它支持“行鎖” ,於是在寫操作比較多的時候,會更優秀。並且,他還支持更多的高級應用,比如:事務。

下麵是MySQL的手冊

target=”_blank”MyISAM Storage Engine

InnoDB Storage Engine

  20. 使用一個對象關係映射器(Object Relational Mapper)

使用 ORM (Object Relational Mapper),你能夠獲得可靠的性能增漲。一個ORM可以做的所有事情,也能被手動的編寫出來。但是,這需要一個高級專家。

ORM 的最重要的是“Lazy Loading”,也就是說,只有在需要的去取值的時候才會去真正的去做。但你也需要小心這種機制的副作用,因為這很有可能會因為要去創建很多很多小的查詢反而會降低性能。

ORM 還可以把你的SQL語句打包成一個事務,這會比單獨執行他們快得多得多。

目前,個人最喜歡的PHP的ORM是:Doctrine。

  21. 小心“永久鏈接”

“永久鏈接”的目的是用來減少重新創建MySQL鏈接的次數。當一個鏈接被創建了,它會永遠處在連接的狀態,就算是資料庫操作已經結束了。而且,自 從我們的Apache開始重用它的子進程後——也就是說,下一次的HTTP請求會重用Apache的子進程,並重用相同的 MySQL 鏈接。

PHP手冊:mysql_pconnect()

在理論上來說,這聽起來非常的不錯。但是從個人經驗(也是大多數人的)上來說,這個功能製造出來的麻煩事更多。因為,你只有有限的鏈接數,記憶體問題,文件句柄數,等等。

而且,Apache 運行在極端並行的環境中,會創建很多很多的了進程。這就是為什麼這種“永久鏈接”的機制工作地不好的原因。在你決定要使用“永久鏈接”之前,你需要好好地考慮一下你的整個系統的架構。

 

補充:

mysql強制索引和禁止某個索引

1、mysql強制使用索引:force index(索引名或者主鍵PRI)

例如:

select * from table force index(PRI) limit 2;(強制使用主鍵)

select * from table force index(ziduan1_index) limit 2;(強制使用索引”ziduan1_index”)

select * from table force index(PRI,ziduan1_index) limit 2;(強制使用索引”PRI和ziduan1_index”)

 

2、mysql禁止某個索引:ignore index(索引名或者主鍵PRI)

例如:

select * from table ignore index(PRI) limit 2;(禁止使用主鍵)

select * from table ignore index(ziduan1_index) limit 2;(禁止使用索引”ziduan1_index”)

select * from table ignore index(PRI,ziduan1_index) limit 2;(禁止使用索引”PRI,ziduan1_index”)

你對人生迷茫嗎? 那就背起行囊,起步遠行吧
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • localStorage(本地存儲),可以長期存儲數據,沒有時間限制,一天,一年,兩年甚至更長,數據都可以使用。sessionStorage(會話存儲),只有在瀏覽器被關閉之前使用,創建另一個頁面時同意可以使用,關閉瀏覽器之後數據就會消失。 HTML5 的本地存儲 API 中的 localStora ...
  • 1、Math.random():返回 0 ~ 1 之間的隨機數。2、Math.ceil():返回值:返回大於或等於x,並且與之最接近的整數(如果x是正數,則把小數“入”;如果x是負數,則把小數“舍”)。3、Math.round():四捨五入取整。4、Math.floor():返回值:返回小於或等於x ...
  • 僅記錄一些我工作中常用的自定義js函數。 1、獲取URL請求參數 調用方式:var id = GetQueryString("id"); 2、在文本框中游標位置插入文本值 調用方式:這裡使用了easyui中的combobox控制項和ueditor富文本控制項 easyui-combobox代碼: $(" ...
  • 第一種方法: 第二種方法: ...
  • Observer協處理器通常在一個特定的事件(諸如Get或Put)之前或之後發生,相當於RDBMS中的觸發器。Endpoint協處理器則類似於RDBMS中的存儲過程,因為它可以讓你在RegionServer上對數據執行自定義計算,而不是在客戶端上執行計算。 本文是以上兩者的簡單實例,使用的環境:環境 ...
  • MongoDB提供了備份和恢復的功能,分別是MongoDB下載目錄下的mongodump.exe和mongorestore.exe文件 1.備份數據使用下麵的命令: >mongodump -h dbhost -d dbname -o dbdirectory -h:MongDB所在伺服器地址,例如:1 ...
  • 1.創建集合有兩種方式,顯示創建和隱式創建 顯示創建可以使用命令 db.createCollection(“集合名稱") 隱式創建可以使用命令 db.集合名稱.insert({}),指創建集合併同時向集合中插入數據,例如:db.customer.insert({name:”jack”}) 刪除集合使 ...
  • 前段時間在做用戶畫像的時候,遇到了這樣的一個問題,記錄某一個商品的用戶購買群,剛好這種需求就可以用到Redis中的Set,key作為productID,value 就是具體的customerid集合,後續的話,我就可以通過productid來查看該customerid是否買了此商品,如果購買了,就可 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...