[2]-Mysql


索引的數據結構: 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
    • 再買一個小水缸,放在旁邊,連通
  • 縱向拓展
    • 買一個大水缸,把魚、水草重新佈置到大水缸

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章