建立了三個表
一對一連接:
將一個表的主鍵插入到另外一個表裏
一對多連接:
要創建中間表
JOIN 連接
JOIN 按照功能大致分爲如下三類:
INNER JOIN(內連接,或等值連接):獲取兩個表中字段匹配關係的記錄。
LEFT JOIN(左連接):獲取左表所有記錄,即使右表沒有對應匹配的記錄。
RIGHT JOIN(右連接): 與 LEFT JOIN 相反,用於獲取右表所有記錄,即使左表沒有對應匹配的記錄。
外連接查詢
帶in的子查詢:(查找買過東西的人的信息 通過訂單中的orderid查詢)
內連接查詢
查找買過東西的用戶的信息
小表是整表的搜索 用小表的id去大表裏查詢 不用產生存儲臨時數據的中間表(a,b是別名)
建索引給大表 用小表id去大表裏找
左鏈接查詢
查右邊的表沒有的左邊的數據
查沒有買過東西的用戶的信息
索引
B+樹即排序的樹
主鍵默認就建索引
上圖中--------
給name字段添加索引後:
- 主鍵索引樹 放的是所有的值
- 輔助索引樹放的是當前的索引+主鍵id
對於select name,id from user where name=‘wang’;
不用回到主鍵索引樹
對於select name,id,age from user where name='wang';
要搜age得去主鍵索引樹上找 因爲name的輔助索引樹只存了name和主鍵id 並沒有存儲age
所以select後面最好指定自己要搜索的東西 不然寫*的話就得輸出全部信息就得回到主鍵索引樹上
創建聯合索引
create index name age index on user(name,age);
聯合索引樹放name age 和主鍵id
select *from user where age =18
這句用不到聯合索引 因爲聯合索引先找第一個字段name 而這句找的age
數據庫項目的優化地方
用explain 查看代碼中操作比較慢的地方
創建的多列聯合索引在用到的時候注意會先找第一個字段
有過濾條件 還有分組 一定要建立聯合索引
設置合理的慢查詢時間,查看慢查詢日誌中執行得慢的代碼 對其進行優化
select *from user where a=3 or b=4;
可能會直接整表查找 但是也會被MySQL Server優化
select *from user where a=3 union select *from user where b=4;
第一次查詢a的索引,第二次查詢b的索引,查詢兩次 然後把這兩次查詢聯合起來
在建表的時候建索引:
給已經建好的表建索引以及刪除索引:
查看我建好的索引的話需要具體到建的鍵 比如給name建了索引 需要用where定位到name=’’
可以看到主鍵已經加到了age上
記錄慢查詢日誌和 慢查詢時間
- explain+SQL語句 查看SQL語句的執行計劃
- 兩個表(A表和B表)的聯合查詢SQL語句,小表決定查詢次數,大表決定查詢時間
- 索引以 磁盤文件的方式 進行存儲
- 使用索引–》 從磁盤文件讀取索引文件(磁盤I/O的次數 越少越好) 把索引文件裏面的數據讀取到內存上,進行組織