1. 程式人生 > 其它 >給你一個區間[t1,t2],求出從t1到t2之間所有數的約數的個數的和。

給你一個區間[t1,t2],求出從t1到t2之間所有數的約數的個數的和。

1:資料庫設計的4要素

  • 表結構
  • 欄位型別、是否允許為null、是否有預設值
  • 索引設計
  • 資料庫引擎的選擇

2:資料庫設計時的注意事項

  1. 為了查詢效率,可以做冗餘欄位的設計(空間換時間的思想,屬於一種反正規化設計)

  2. 欄位型別的選擇

    • 整型的儲存大小與顯示大小

      mysql的欄位,unsigned int(3), 和unsinged int(6), 能儲存的數值範圍是否相同。如果不同,分別是多大?

      我們建立下面這張表:

      CREATE TABLE `test` (
          `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
          `i1` int(
      3) unsigned zerofill DEFAULT NULL, `i2` int(6) unsigned zerofill DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8

      插入一些資料後

      •   

        發現,無論是int(3), int(6), 都可以顯示6位以上的整數。但是,當數字不足3位或6位時,前面會用0補齊。

        手冊解釋是這樣的:

        MySQL還支援選擇在該型別關鍵字後面的括號內指定整數值的顯示寬度(例如,INT(4))。該可選顯示寬度規定用於顯示寬度小於指定的列寬度的值時從左側填滿寬度。顯示寬度並不限制可以在列內儲存的值的範圍,也不限制超過列的指定寬度的值的顯示。

        也就是說,int的長度並不影響資料的儲存精度,長度只和顯示有關,為了讓大家看的更清楚,我們在上面例子的建表語句中,使用了zerofill。

        最終答案:儲存範圍相同。

    • char 與 varchar 的選擇

      • char 不可變,查詢效率高,可能造成儲存浪費
        • 欄位b:型別char(10), 值為:abc,儲存為:abc_______(abc+7個空格)
        • 欄位c:型別char(3), 值為:abcdefg,儲存為:abc(defg自動刪除)
        • char最多可以存放255個字元
      • varchar 可變,查詢效率不如char,節省空間
        • 欄位d:型別varchar(10), 值為:abc,儲存為:abc (自動變為3個的長度)
        • 欄位e:型別varchar(3), 值為:abcdefg,儲存為:abc (defg自動刪除)
        • varchar的最大長度為65535個位元組,varchar可存放的字元數跟編碼有關
          • 字元型別若為gbk,每個字元最多佔2個位元組,最大長度不能超過32766個字元

            字元型別若為utf8,每個字元最多佔3個位元組,最大長度不能超過21845個字元

常見MySQL資料型別

類 型大 小描 述
CAHR(Length) Length位元組 定長欄位,長度為0~255個字元
VARCHAR(Length) String長度+1位元組或String長度+2位元組 變長欄位,長度為0~65 535個字元
TINYTEXT String長度+1位元組 字串,最大長度為255個字元
TEXT String長度+2位元組 字串,最大長度為65 535個字元
MEDIUMINT String長度+3位元組 字串,最大長度為16 777 215個字元
LONGTEXT String長度+4位元組 字串,最大長度為4 294 967 295個字元
TINYINT(Length) 1位元組 範圍:-128~127,或者0~255(無符號)
SMALLINT(Length) 2位元組 範圍:-32 768~32 767,或者0~65 535(無符號)
MEDIUMINT(Length) 3位元組 範圍:-8 388 608~8 388 607,或者0~16 777 215(無符號)
INT(Length) 4位元組 範圍:-2 147 483 648~2 147 483 647,或者0~4 294 967 295(無符號)
BIGINT(Length) 8位元組 範圍:-9 223 372 036 854 775 808~9 223 372 036 854 775 807,或者0~18 446 744 073 709 551 615(無符號)
FLOAT(Length, Decimals) 4位元組 具有浮動小數點的較小的數
DOUBLE(Length, Decimals) 8位元組 具有浮動小數點的較大的數
DECIMAL(Length, Decimals) Length+1位元組或Length+2位元組 儲存為字串的DOUBLE,允許固定的小數點
DATE 3位元組 採用YYYY-MM-DD格式
DATETIME 8位元組 採用YYYY-MM-DD HH:MM:SS格式
TIMESTAMP 4位元組 採用YYYYMMDDHHMMSS格式;可接受的範圍終止於2037年
TIME 3位元組 採用HH:MM:SS格式
ENUM 1或2位元組 Enumeration(列舉)的簡寫,這意味著每一列都可以具有多個可能的值之一
SET 1、2、3、4或8位元組 與ENUM一樣,只不過每一列都可以具有多個可能的值

  3:索引

    • 主鍵 Primary Key

    • 外來鍵 Foreign Key

      • 保持資料完整性
        
      ALTER TABLE tbl_name
          ADD [CONSTRAINT [symbol]] FOREIGN KEY
          [index_name] (index_col_name, ...)
          REFERENCES tbl_name (index_col_name,...)
          [ON DELETE reference_option]
          [ON UPDATE reference_option]

      例如:

      ALTER TABLE `user_resource` CONSTRAINT `FKEEAF1E02D82D57F9` FOREIGN KEY (`user_Id`) REFERENCES `sys_user` (`Id`)

      CASCADE

      在父表上update/delete記錄時,同步update/delete掉子表的匹配記錄

      • ON DELETE:刪除主表時自動刪除從表。刪除從表,主表不變
      • ON UPDATE:更新主表時自動更新從表。更新從表,主表不變

      SET NULL

      在父表上update/delete記錄時,將子表上匹配記錄的列設為null (要注意子表的外來鍵列不能為not null)

      • ON DELETE:刪除主表時自動更新從表值為NULL。刪除從表,主表不變
      • ON UPDATE:更新主表時自動更新從表值為NULL。更新從表,主表不變

      NO ACTION

      如果子表中有匹配的記錄,則不允許對父表對應候選鍵進行update/delete操作

      • ON DELETE:從表記錄不存在時,主表才可以刪除。刪除從表,主表不變
      • ON UPDATE:從表記錄不存在時,主表才可以更新。更新從表,主表不變

      RESTRICT

      同no action, 都是立即檢查外來鍵約束

      SET DEFAULT

      父表有變更時,子表將外來鍵列設定成一個預設的值 但Innodb目前不支援

    • 索引 Key / Index

      • 提升查詢效率,減慢增刪改速度
    • 唯一約束 Unique

      • 保證資料不重複

4:資料庫引擎

資料庫儲存引擎是資料庫底層軟體組織,資料庫管理系統(DBMS)使用資料引擎進行建立、查詢、更新和刪除資料。不同的儲存引擎提供不同的儲存機制、索引技巧、鎖定水平等功能,使用不同的儲存引擎,還可以 獲得特定的功能。現在許多不同的資料庫管理系統都支援多種不同的資料引擎。MySQL的核心就是儲存引擎。

SHOW ENGINES  # 命令來檢視MySQL提供的引擎

SHOW VARIABLES LIKE 'storage_engine'; # 檢視資料庫預設使用哪個引擎

InnoDB儲存引擎

InnoDB是事務型資料庫的首選引擎,支援事務安全表(ACID),支援行鎖定和外來鍵,InnoDB是預設的MySQL引擎。InnoDB主要特性有:

1、InnoDB給MySQL提供了具有提交、回滾和崩潰恢復能力的事物安全(ACID相容)儲存引擎。

InnoDB鎖定在行級並且也在SELECT語句中提供一個類似Oracle的非鎖定讀。這些功能增加了多使用者部署和效能。在SQL查詢中,可以自由地將InnoDB型別的表和其他MySQL的表型別混合起來,甚至在同一個查詢中也可以混合

2、InnoDB是為處理巨大資料量的最大效能設計。它的CPU效率可能是任何其他基於磁碟的關係型資料庫引擎鎖不能匹敵的

3、InnoDB儲存引擎完全與MySQL伺服器整合,InnoDB儲存引擎為在主記憶體中快取資料和索引而維持它自己的緩衝池。InnoDB將它的表和索引在一個邏輯表空間中,表空間可以包含數個檔案(或原始磁碟檔案)。這與MyISAM表不同,比如在MyISAM表中每個表被存放在分離的檔案中。InnoDB表可以是任何尺寸,即使在檔案尺寸被限制為2GB的作業系統上

4、InnoDB支援外來鍵完整性約束

5、儲存表中的資料時,每張表的儲存都按主鍵順序存放,如果沒有顯示在表定義時指定主鍵,InnoDB會為每一行生成一個6位元組的ROWID,並以此作為主鍵

6、InnoDB被用在眾多需要高效能的大型資料庫站點上

InnoDB不建立目錄,使用InnoDB時,MySQL將在MySQL資料目錄下建立一個名為ibdata1的10MB大小的自動擴充套件資料檔案,以及兩個名為ib_logfile0和ib_logfile1的5MB大小的日誌檔案

MyISAM儲存引擎

MyISAM基於ISAM儲存引擎,並對其進行擴充套件。它是在Web、資料倉儲和其他應用環境下最常使用的儲存引擎之一。MyISAM擁有較高的插入、查詢速度,但不支援事物。MyISAM主要特性有:

1、大檔案(達到63位檔案長度)在支援大檔案的檔案系統和作業系統上被支援

2、當把刪除和更新及插入操作混合使用的時候,動態尺寸的行產生更少碎片。這要通過合併相鄰被刪除的塊,以及若下一個塊被刪除,就擴充套件到下一塊自動完成

3、每個MyISAM表最大索引數是64,這可以通過重新編譯來改變。每個索引最大的列數是16

4、最大的鍵長度是1000位元組,這也可以通過編譯來改變,對於鍵長度超過250位元組的情況,一個超過1024位元組的鍵將被用上

5、BLOB和TEXT列可以被索引

6、NULL被允許在索引的列中,這個值佔每個鍵的0~1個位元組

7、所有數字鍵值以高位元組優先被儲存以允許一個更高的索引壓縮

8、每個MyISAM型別的表都有一個AUTO_INCREMENT的內部列,當INSERT和UPDATE操作的時候該列被更新,同時AUTO_INCREMENT列將被重新整理。所以說,MyISAM型別表的AUTO_INCREMENT列更新比InnoDB型別的AUTO_INCREMENT更快

9、可以把資料檔案和索引檔案放在不同目錄

10、每個字元列可以有不同的字符集

11、有VARCHAR的表可以固定或動態記錄長度

12、VARCHAR和CHAR列可以多達64KB

使用MyISAM引擎建立資料庫,將產生3個檔案。檔案的名字以表名字開始,副檔名之處檔案型別:frm檔案儲存表定義、資料檔案的副檔名為.MYD(MYData)、索引檔案的副檔名時.MYI(MYIndex)

MEMORY儲存引擎

MEMORY儲存引擎將表中的資料儲存到記憶體中,未查詢和引用其他表資料提供快速訪問。MEMORY主要特性有:

1、MEMORY表的每個表可以有多達32個索引,每個索引16列,以及500位元組的最大鍵長度

2、MEMORY儲存引擎執行HASH和BTREE縮影

3、可以在一個MEMORY表中有非唯一鍵值

4、MEMORY表使用一個固定的記錄長度格式

5、MEMORY不支援BLOB或TEXT列

6、MEMORY支援AUTO_INCREMENT列和對可包含NULL值的列的索引

7、MEMORY表在所由客戶端之間共享(就像其他任何非TEMPORARY表)

8、MEMORY表記憶體被儲存在記憶體中,記憶體是MEMORY表和伺服器在查詢處理時的空閒中,建立的內部表共享

9、當不再需要MEMORY表的內容時,要釋放被MEMORY表使用的記憶體,應該執行DELETE FROM或TRUNCATE TABLE,或者刪除整個表(使用DROP TABLE)

儲存引擎的選擇

不同的儲存引擎都有各自的特點,以適應不同的需求,如下表所示: