淺談Mysql常見注意事項一
-
不要在Mysql中使用utf8
Mysql中utf8并不是真正意義上的utf8,而是指的是utf8mb3,這種字符集僅支持BMP字符,碼位在0到65535之間,不支持一些補充字符,例如一些生僻字和emoji表情,utf8mb3是Mysql早期就支持的字符集,由于不支持補充字符,Mysql在5.5.3之后的版本里面增加了utf8mb4的編碼,在未來Mysql版本中,可能會洗掉utf8mb3字符集,utf8mb4支持BMP和補充字符,對于BMP字符,utf8mb4和utf8mb3相同,但是對于補充字符,utf8mb4需要4個位元組存盤,utf8mb3每個字符最多使用3個位元組,無法存盤該字符,所以在創建表,使用utf8mb4,而不是utf8或者utf8mb3,
字符集 支持的字符 每個字符存盤需要的位元組 utf8mb3、utf8(deprecated) BMP 1~3位元組 ucs2 BMP 2位元組 utf8mb4 BPM和補充字符 1~4位元組 utf16 BMP和補充字符 2位元組或4位元組 utf16le BMP和補充字符 2位元組或4位元組 utf32 BMP和補充字符 4位元組 Mysql官方檔案說明:https://dev.mysql.com/doc/refman/8.0/en/charset-unicode.html
-
小數型別使用decimal
推薦使用decimal,不建議使用float和double,float和double會有精度丟失的問題,并且在比較值或者進行減法運算時可能會出現問題,decimal是定點數,在MySQL中,定點數是以字串形式存盤,所以在精度要求比較高時,推薦使用decimal型別,如果存盤的資料超出decimal訪問時,可以將資料按照整數和小數分開存盤,
資料型別 說明 存盤位元組 float 單精度浮點數 4個位元組 double 雙精度浮點數 8個位元組 decimal(M, D),M默認值是10 壓縮的"嚴格"定點數 根據M和D而定 官網decimal存盤位元組表格
Leftover Digits Number of Bytes 0 0 1-2 1 3-4 2 5-6 3 7-9 4 decimal存盤位元組計算:Mysql是將每9位十進制存盤為4個位元組,
例如:以官網例子為例
decimal(18, 9):小數部分是9,需要4個位元組,整數部分也是9,也需要4個位元組,
decimal(20, 6): 小數部分是6,需要3個位元組,整數部分是14,14-9=5,整數部分需要4個位元組+剩余的5個存盤需要的3個位元組,
-
推薦統計值使用count(*)
在阿里JAVA開發手冊中推薦使用count(*),不要使用count(列名),count(常量),count(列名)會查詢符合條件的并且列的值不為NULL的行數,也就是說會過濾掉列為NULL的行,除非有特殊的需求,所以一般不要使用,count(*)在MySQL8.0.13之后對SELECT COUNT(*) FROM tbl_name進行了優化,效率得到提升,InnoDB引擎count(*)和count(1)其實是一樣的,不存在誰快誰慢的問題,不過推薦使用count(*),符合SQL92定義的標準統計行數的語法,以下附上官網關于count(*)的說明及鏈接,感興趣的小伙伴可以研究研究官方檔案,
MySQL官方檔案說明:https://dev.mysql.com/doc/refman/8.0/en/aggregate-functions.html#function_count
As of MySQL 8.0.13, SELECT COUNT(*) FROM tbl_name query performance for InnoDB tables is optimized for single-threaded workloads if there are no extra clauses such as WHERE or GROUP BY.
InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) operations in the same way. There is no performance difference.
原文鏈接:https://monkey.blog.xpyvip.top/archives/qian-tan-mysql-chang-jian-zhu-yi-shi-xiang-yi
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/511010.html
標籤:其他
下一篇:day07-1MySQL約束
