索引
定義
索引用來快速地尋找那些具有特定值的記錄,所有MySQL索引都以B樹的形式保存。就像是數據的目錄。
索引類型
唯一索引
主鍵索引
B-Tree
普通索引
R-Tree
聯合索引
Hash
全文索引
FullText
在mysql中fulltext索引只針對myisam生效。
符合索引
對于創建的多列索引(復合索引),不是使用第一部分就不會使用索引。
對于like查詢前面%通配符不會使用索引,通配符在后面會使用索引。
使用or要求所有字段都必須有索引,否則不會使用索引。
索引注意事項
#避免使用雙%號的查詢條件。
如a like '%123%',(如果無前置%,只有后置%,是可以用到列上的索引的)
事務隔離級別
read uncommitted 未提交讀
所有事務都可以看到沒有提交事務的數據。是所有隔離級別中最低的一種,會出現臟讀。
臟讀
那就是我們在一個事務中可以隨隨便便讀取到其他事務未提交的數據,這還是比較麻煩的,我們叫臟讀。
read committed 提交讀
事務成功提交后才可以被查詢到。
不可重復讀
那就是我們在會話B同一個事務中,讀取到兩次不同的結果。這就造成了不可重復讀,就是兩次讀取的結果不同。這種現象叫不可重復讀。
repeatable 重復讀
同一個事務多個實例讀取數據時,可能將未提交的記錄查詢出來,而出現幻讀。
mysql默認級別,一個事物中數據一致。
Serializable可串行化
強制的進行排序,在每個讀讀數據行上添加共享鎖。會導致大量超時現象和鎖競爭。
隔離界別查詢
1.查看當前會話隔離級別
select @@tx_isolation;
2.查看系統當前隔離級別
select @@global.tx_isolation;
3.設置當前會話隔離級別
set session transaction isolatin level repeatable read;
4.設置系統當前隔離級別
set global transaction isolation level repeatable read;
數據庫鎖
鎖粒度
表級鎖
行級鎖
頁級鎖
鎖級別
共享鎖
排它鎖
加鎖方式
自動鎖
顯示鎖
操作
DML DDL鎖
使用方式
樂觀鎖
update test_innodb set money=123,version=0+1 where version=0 and id=2;
悲觀鎖
數據類型
INT
1.BIT[M]
位字段類型,M表示每個值的位數,范圍從1到64,如果M被忽略,默認為1
2.TINYINT[(M)] [UNSIGNED] [ZEROFILL] M默認為4
很小的整數。帶符號的范圍是-128到127。無符號的范圍是0到255。
3. BOOL,BOOLEAN
是TINYINT(1)的同義詞。zero值被視為假。非zero值視為真。
4.SMALLINT[(M)] [UNSIGNED] [ZEROFILL] M默認為6
小的整數。帶符號的范圍是-32768到32767。無符號的范圍是0到65535。
5.MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL] M默認為9
中等大小的整數。帶符號的范圍是-8388608到8388607。無符號的范圍是0到16777215。
6. INT[(M)] [UNSIGNED] [ZEROFILL] M默認為11
普通大小的整數。帶符號的范圍是-2147483648到2147483647。無符號的范圍是0到4294967295。
7.BIGINT[(M)] [UNSIGNED] [ZEROFILL] M默認為20
大整數。帶符號的范圍是-9223372036854775808到9223372036854775807。無符號的范圍是0到18446744073709551615。
注意:這里的M代表的并不是存儲在數據庫中的具體的長度,以前總是會誤以為int(3)只能存儲3個長度的數字,int(11)就會存儲11個長度的數字,這是大錯特錯的。
其實當我們在選擇使用int的類型的時候,不論是int(3)還是int(11),它在數據庫里面存儲的都是4個字節的長度,在使用int(3)的時候如果你輸入的是10,會默認給你存儲位010,也就是說這個3代表的是默認的一個長度,當你不足3位時,會幫你不全,當你超過3位時,就沒有任何的影響。
varchar
4.0版本以下,varchar(100),指的是100字節,如果存放UTF8漢字時,只能存33個(每個漢字3字節)
5.0版本以上,varchar(100),指的是100字符,無論存放的是數字、字母還是UTF8漢字(每個漢字3字節),都可以存放100個。
UTF8編碼中一個漢字(包括數字)占用3個字節
GBK編碼中一個漢字(包括數字)占用2個字節
時間類型
date yyyy-mm-dd 日期值
time hh:mm:ss 時間值
year yyyy 年份
datetime yyyy-mm-dd hh:mm:ss 日期
timestamp yyyymmddhhmmss 日期
Java對應Mysql類型
Java 類型 SQL 類型
int : java.lang.Integer INTEGER
long : java.lang.Long BIGINT
short : java.lang.Short SMALLINT
float : java.lang.Float FLOAT
double : java.lang.Double DOUBLE
java.math.BigDecimal : NUMERIC
java.lang.String :VARCHAR
byte : java.lang.Byte TINYINT
boolean :java.lang.Boolean bit(值為0或1)
date : LocalDate
time : LocalTime
timestamp : LocalDateTime
常用函數
#find_in_set
like是廣泛的模糊匹配,字符串中沒有分隔符,find_in_set是精確匹配,字段值以英文”,”分隔,FIND_IN_SET(str,strlist)。 假如字符串str 在由N 子鏈組成的字符串列表strlist 中,則返回值的范圍在 1 到 N 之間
SELECT * from video where find_in_set('4',week);
常用Sql
#性能查詢,用于檢測瓶頸,查看執行和擁堵情況
SHOW PROCESSLIST
#分析工具
explain sql
#分步查看sql的最終執行順序
1 EXPLAIN EXTENDED
SELECT record_start_time AS 'record_time' FROM iindex.iindex_object_audience_analysis_red_black_natural_cycle WHERE record_start_time >= '2019-04-15'
AND record_start_time <= '2019-06-24' ;
2 SHOW WARNINGS;
#強制使用索引
mysql強制使用索引:force index(索引名或者主鍵PRI)
#查看session是否為自動提交
show variables like "autocommit"
#查看當前數據庫的字符集
show variables like '%character%'
#查詢索引
show index from 表名
#復制一張表(也可以先用mysqladmin導出數據,再導入)
CREATE TABLE tbl1 LIKE tbl;
INSERT INTO tbl1 SELECT * FROM tbl;
#性能檢測
mysql > SET PROFILING = 1;
mysql > ...
mysql > SHOW PROFILES;
存儲引擎
InnoDB
適合場景
數據庫的增刪改查都相當頻繁
可靠性要求比較高,要求支持事物
MyISAM
適合場景
頻繁執行全表count語句
對數據進行增刪改的頻率不高,查詢非常頻繁
沒有事物
知識點
最左匹配原則
mysql會一直向右匹配知道遇到范圍查詢(>,5 and d=4 如果建立abcd的索引,d就用不到索引。
=和in可以亂序
比如a=1 and b=2 and c=3 建立(a,b,c)索引可以任意順序,mysql的查詢優化器會幫你優化成索引認識的形式
單表
#盡量控制單表數據量的大小,建議控制在500萬以內
500萬并不是MySQL數據庫的限制,過大會造成修改表結構,備份,恢復都會有很大的問題
可以用歷史數據歸檔(應用于日志數據),分庫分表(應用于業務數據)等手段來控制數據量大小
#限制每張表上的索引數量,建議單張表索引不超過5個
數據庫和表的字符集統一使用UTF8
兼容性更好,統一字符集可以避免由于字符集轉換產生的亂碼,不同的字符集進行比較前需要進行轉換會造成索引失效
盡量not null
MYSQL對NULL字段索引優化不佳,增加更多的計算難度,同時在保存與處理NULL類形時,也會做更多的工作,所以從效率上來說,不建議用過多的NULL,解決方法是數值弄用整數0,字符串用空來定義默認值即可。
業務常見問題
特殊字符插入問題
Incorrect string value: '\xF0\x9F\x90\xBE' for column 'nick_name' at row 1
1 數據庫字段編碼設置utf8mb4
2 數據庫連接設置utf8
mysql.dev_ifans.url=jdbc:mysql://192.168.32.114:3306/istar_test?autoReconnect=true&characterEncoding=UTF8
3 以上沒問題檢查數據庫連接版本
mysql
mysql-connector-java
5.1.47
標簽:lang,java,int,數據庫,MySql,手冊,索引,mysql,速查
來源: https://www.cnblogs.com/gustavo/p/12227263.html