索引的數據結構: B樹、B+樹
- 索引本身很大,不能全存在內存,以索引文件的形式存在磁盤
- 查找過程產生磁盤IO消耗,儘量減少磁盤IO的存取次數
- B樹定義,檢索一次最多訪問h個節點,O(logdN)根據,d大於100,h最多爲3
- 節點的大小設爲頁大小,只要一次IO就可以完全載入
B樹、B+ 樹區別
B樹:
- 每個節點都是關鍵字
B+樹:
非葉節點僅具有索引作用,關鍵字只存放在葉節點
葉節點構成有序鏈表,可按關鍵碼排序的次序遍歷所有記錄
索引分類
- 普通索引:create index 索引名字 on 表名 (字段(長度));
唯一索引:索引列的值必須唯一,create unique index
主鍵索引:建表的同時,默認生成的
- 全文索引:full text,僅可用於myisam,可以在char、varchar或text類型的列上創建
- 複合索引
- 最左前綴
索引由存儲引擎實現,本質是數據結構
- myisam:非聚集索引
- 在磁盤存三個文件,存儲表定義、數據文件、索引文件
- 強調性能,不提供事務支持
- 表鎖,一次獲得所需鎖,不會死鎖
innodb:聚集索引
- “表空間”數據文件和日誌文件
- 提供事務支持和外鍵等高級數據庫功能
行鎖,鎖索引,逐步獲得鎖,可能死鎖
- 如果一條sql語句操作了主鍵索引,MySQL就會鎖定這條主鍵索引
如果一條語句操作了非主鍵索引,MySQL會先鎖定該非主鍵索引,再鎖定相關的主鍵索引。
當兩個事務同時執行,一個鎖住了主鍵索引,在等待其他相關索引
- 另一個鎖定了非主鍵索引,在等待主鍵索引。這樣就會發生死鎖。
MySql優化
- 設置字段爲主鍵,自動添加索引
- not in 替換成 not exists
- <>目標 替換成>目標 or <目標
- 不在列上進行運算 year(udate)<2007 改成 udate>”2007-01-01”
- 刪除不再使用或很少使用的索引
- 創建複合索引,最左前綴
- 若創建(area,age,salary)的複合索引
- 相當於創建了(area,age,salary)、(area,age)、area三個索引
- 使用前綴來索引
- 比如CHAR(255)的列,前10個字符內,大多數值是唯一的
- like語句
- like “%目標%” 不會使用索引
- like “目標%” 可以使用索引
KEY
- PRIMARY KEY是一個唯一KEY,所有的關鍵字列必須定義爲NOT NULL。
- 一個表只有一個PRIMARY KEY
- KEY未必都是外鍵,KEY是索引約束
- 對錶中字段進行索引約束,都是通過primary foreign unique等創建
- KEY主要是用來加快查詢速度
建表語句
CREATE TABLE `PictureTimeInfo` (
`PictureId` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
`TypeId` int(11) NOT NULL COMMENT '卷業務類型',
`PictureUrl` varchar(500) NOT NULL COMMENT '圖片URL',
`BeginTime` datetime NOT NULL COMMENT '起始時間',
`EndTime` datetime NOT NULL COMMENT '結束時間',
`AddTime` datetime NOT NULL COMMENT '添加時間',
`UpdateTime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最後修改時間',
PRIMARY KEY (`PictureId`),
KEY `IX_BeginTime_EndTime` (`BeginTime`,`EndTime`),
KEY `IX_AddTime` (`AddTime`),
KEY `IX_UpdateTime` (`UpdateTime`))
ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8 COMMENT='背景圖方案表';
mysql語句執行順序
[7]
select distinct(s1.spot_id_no),s2.spot_name
[1]
from point_info s1
[3]
left join spot_info s2
[2]
on s1.spot_id_no=s2.spot_id_no
[4]
where s1.spot_id_no=s2.spot_id_no
[5]
group by s1.spot_id_no
[6]
having count(s1.spot_id_no)>10
[8]
order by s2.spot_name desc
[9]
limit 0,1
連接查詢
- 內連接
join
- 外連接
- 左外連接
left join
A:有 B:NULL - 右外連接
right join
A:NULL B:有 - 完全連接
full join
以上兩種都有
- 左外連接
- 交叉連接
MySql和NoSql區別
- sql是基於表的數據庫,而nosql數據庫有基於文檔的、鍵值對的
- 對於複雜的查詢
- 分層次的數據存儲
- ACID和CAP持久性、可用性、分區容忍性
橫向、縱向擴展
- 橫向擴展Scale-out
- 再買一個小水缸,放在旁邊,連通
- 縱向拓展
- 買一個大水缸,把魚、水草重新佈置到大水缸