mysql 修改字符集編碼之後重啓創建的數據庫能夠生效。
mysql 修改字符集編碼之後重啓不能對修改字符集之前的數據庫產生影響(該亂碼還是得亂碼)
frm文件:數據庫結構文件
myd文件:存放的是表數據
myi文件:存放的是數據索引
mysql數據庫的分層:
第一層:連接層
第二層:服務層,主要完成的是核心服務功能,如:SQL接口,並完成緩存的查詢,SQL分析和優化及部分內置函數的執行。
第三層:引擎層,存儲引擎。存儲引擎真正的負責了Mysql中數據的存儲和提取,通過api和存儲引擎進行通信。不同的引擎有不同的特點:常用的是InnoDB和MyIsam
第四層:存儲層,主要是將數據存儲在運行與裸設備的文件系統之上,並完成與存儲引擎的交互。
sql性能下降、執行時間長的原因和處理方式?
1.sql本身寫的不好
2.索引失效
3.關聯查詢太多(join太多)
4.mysql數據庫的配置:如緩衝、線程數
mysql機讀的時候先讀什麼關鍵字?
join關鍵字 :
inner join :兩個表的交集
left join : 左表的全部 + 右表的交集
right join :兩個表的交集 + 右表的全部
left join + b.key is null : 左表的全部 - 和右表的交集
full outer join : 全連接
union : 將兩者的sql結果去重合並
-- inner join 交集
SELECT * FROM t_user u INNER JOIN t_model m on u.`name` = m.userId;
-- lefet JOIN 左連接:左邊的全部數據 + 右邊和左邊交集key的數據
SELECT * FROM t_user u LEFT JOIN t_model m on u.`name` = m.userId;
-- RIGHT JOIN 又連接:右邊的全部數據 + 左邊和右邊交集key的數據
SELECT * FROM t_user u RIGHT JOIN t_model m ON u.`name` = m.userId;
-- 左邊的數據除去和右邊有外鍵關聯的數據
SELECT * FROM t_user u LEFT JOIN t_model m ON u.`name` = m.userId WHERE m.userId is NULL;
-- 右邊的數據除去和左邊有外鍵關聯的數據
SELECT * FROM t_user u RIGHT JOIN t_model m on u.`name` = m.userId where u.id is NULL;
-- 左邊除掉右邊關聯數據 + 右邊除去左邊關聯數據
SELECT * from t_user u LEFT JOIN t_author a on u.id = a.id where a.id is NULL
UNION
SELECT * from t_user u RIGHT JOIN t_author a on u.id = a.id WHERE u.id is null
mysql索引:幫助mysql高效獲取數據的數據結構。提高查找效率,類比於字典。
索引的本質:索引是數據結構。排好序的快速查找的數據結構。 where order by
建立了索引的數據庫最好不要真正的刪除索引。
涉及到了大量數據的創建和刪除之後可能會需要重建索引。
索引的優點:
1.提高了數據的檢索效率,減少了數據庫的IO成本。
2.索引對數據進行排序,降低了排序成本,減少了cpu的消耗。
索引的劣勢:
1.索引也會佔用空間,大量索引會出現索引消耗資源太多。
2.插入、刪除、修改數據的時候還需要創建、修改、刪除數據,增加數據庫的壓力。
索引的分類:
1.單一索引:一個索引只包含一個列,一個表可以有多個單一索引。一個表最多最好建立五個單一索引
2.複合索引;一個索引包涵多個列,查找的還是遵循索引最左原則
3.唯一索引:索引列的值必須唯一,但是允許爲null
什麼時候創建索引?
1.主鍵自動創建唯一索引
2.頻繁作爲查詢條件的字段應該創建索引
3.查詢中又外鍵關係的字段應該創建索引
4.儘量創建複合索引
5.where、order、group後面的數據需要創建索引
什麼時候不創建索引?
1.表的數據少
2.經常進行增刪改查的字段
3.字段只有幾個值的字段比如:國籍、性別、boolean,這樣創建索引對查詢速度提升不大。
mysql的性能分析?
1.mysql有自己的最優處理分析器。
2.CPU\IO
3.EXPLAIN:分析報告
1.explain執行計劃
2.id:決定了表的讀取順序(表的讀取順序並不是sql中的書寫順序)
值相同的時候從table由上到下執行
值不相同時由id最大的table執行到最小的table
值相同不同,先執行值最大的,然後順序執行值小的兩張表
3.select_type: 讀取數據的操作類型
simple:簡單的查詢,不包含子查詢和union
primary: 查詢中包涵任何的子查詢
subquery:在select或者where條件中包含了子查詢
union:
union result:
4.type : 最好是要都能達到range(範圍)、ref,需要避免all查詢
system(只有一條數據) > const(唯一主鍵常量查詢) > eq_ref(聯合查詢,第二張表只有一條記錄) > ref > range > index > all
5.key : 實際使用的索引,null表示沒有命中索引,或者說該字段根本就沒有索引
6.possible-key : 理論上使用到的索引
7.key_len : 索引key的長度。在查詢結果一致的情況下key_len 越短越好
8.rows : mysql優化器掃描的行數
9.extra :額外信息
using filesort :order by後面不能命中索引,索引排序不對,mysql自動重新排序。(索引質量低下,比較危險需要重建索引)
using temporary:使用臨時表保存中間結果並分組(非常不友好)