這兩個指標有什麼區別?我指的是兩列下的「主要」及其他方式爲之間的差..MySQL索引定義,有什麼區別?
1
A
回答
3
第一指該組合user_id, wallet_type
是唯一的,所述第二隻定義visitid
是唯一的。
0
第一個被稱爲多列,複合或複合鍵。在這種情況下,主鍵約束是兩列的組合,按列出的順序(user_id,然後是wallet_type)。合併的兩列必須對每一行都是唯一的。
所以,下面的數據是好的:
user_id(pk) wallet_type(pk)
-------------------------
1 1
1 2
2 2
注意行可以有重複的user_id的或wallet_type的,但不能同時:
user_id(pk) wallet_type(pk)
-------------------------
1 1
1 2
2 2
1 1 // Duplicate key
第二個例子只是一個普通的單柱鍵,其中visitid列中的正確值必須是唯一的:
visitid(pk) session
-------------------------
1 1
1 2 // Duplicate key
There對此有很多影響。
多列主鍵較大,因此它使用更多的存儲空間,並且MySQL要遍歷的速度稍慢。
此外,對於InnoDB,由於主鍵是聚簇索引,因此插入會受到負面影響,這意味着它們按物理順序存儲。更大的索引需要更長的時間更新。但是,追加行到最後還是可以的。
有一些好處,例如可以使用多列索引作爲covering索引。
例如,以下查詢將與所述多列主鍵優化:
SELECT user_id, wallet_type FROM table1 WHERE user_id = 1
SELECT user_id, wallet_type FROM table1 WHERE user_id = 1 AND wallet_type = 2
SELECT user_id, wallet_type FROM table1 ORDER BY user_id, wallet_type
SELECT user_id, wallet_type FROM table1 WHERE user_id = 1 ORDER BY wallet_type
SELECT user_id, wallet_type FROM table1 WHERE user_id > 1 AND wallet_type > 2
SELECT user_id, wallet_type FROM table1 ORDER BY user_id, wallet_type
然而,由於列左前綴,這個查詢就不會被優化:
SELECT user_id, wallet_type FROM table1 WHERE wallet_type = 2
這是因爲user_id未在WHERE子句中引用,但user_id是密鑰中的第一列。你不能跳過一列。
相關問題
- 1. 散列和索引有什麼區別?
- 2. 索引和分片有什麼區別
- 3. MySQL索引:索引2個字段的方式有什麼區別?
- 4. 部分索引和稀疏索引mongodb有什麼區別?
- 5. 存在和定義有什麼區別?
- 6. 這兩個定義有什麼區別?
- 7. 類型定義和類型引用有什麼區別?
- 8. 分別對2列進行索引和每列的索引有什麼區別?
- 9. 一起或分別聲明索引,有什麼區別?
- 10. 這個MySQL查詢中的索引定義有什麼問題?
- 11. 表索引和視圖索引之間的區別是什麼?
- 12. 定義mysql索引
- 13. MySQL - GROUP BY和DISTINCT有什麼區別?
- 14. MySql中utf8_general_ci和utf8_unicode_ci有什麼區別?
- 15. =和在mysql中有什麼區別?
- 16. mysql中datadir和innodb_data_home_dir有什麼區別?
- 17. MySQL中boolean和bool有什麼區別?
- 18. MySQL,MySQLi和PDO有什麼區別?
- 19. apache derby vs mysql有什麼區別
- 20. mysqlimport和mysql有什麼區別<dbfile.sql
- 21. MySQL中兩個DDL有什麼區別?
- 22. 對象和引用有什麼區別?
- 23. __weak和__block引用有什麼區別?
- 24. 指定json的鍵有沒有引號有什麼區別?
- 25. 複合主索引與兩個主索引之間有什麼區別?
- 26. 索引掃描,表掃描和索引查找有什麼區別?
- 27. 所有mysql引擎的主要區別是什麼?
- 28. 有什麼區別
- 29. 有什麼區別
- 30. 有什麼區別?