日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

数据库(MySQL)

發布時間:2024/4/13 数据库 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据库(MySQL) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
數據庫優化建表優化1)數據庫范式第一范式(1NF):強調的是列的原子性,即列不能夠再分成其他幾列。如電話列可進行拆分---家庭電話、公司電話第二范式(2NF):首先是 1NF,另外包含兩部分內容,一是表必須有主鍵;二是沒有包含在主鍵中的列必須 完全依賴于主鍵,而不能只依賴于主鍵的一部分。第三范式(3NF):首先是 2NF,另外非主鍵列必須直接依賴于主鍵,不能存在傳遞依賴。比如Student表(學號,姓名,年齡,性別,所在院校,院校地址,院校電話)這樣一個表結構,就存在上述關系。 學號--> 所在院校 --> (院校地址,院校電話)這樣的表結構,我們應該拆開來,如下。(學號,姓名,年齡,性別,所在院校)--(所在院校,院校地址,院校電話)滿足這些規范的數據庫是簡潔的、結構明晰的;同時,不會發生插入(insert)、刪除(delete)和 更新(update)操作異常。2)數據類型選擇數字類型Float和double選擇(盡量選擇float)區分開TINYINT / INT / BIGINT,能確定不會使用負數的字段,建議添加 unsigned定義能夠用數字類型的字段盡量選擇數字類型而不用字符串類型的字符類型char,varchar,TEXT的選擇:非萬不得已不要使用 TEXT 數據類型,定長字段,建議使用 CHAR 類型 (填空格),不定長字段盡量使用 VARCHAR(自動適應長度,超過階段),且僅僅設定適當的最大長度時間類型按選擇優先級排序DATE(精確到天)、TIMESTAMP、DATETIME(精確到時間)ENUM 對于狀態字段,可以嘗試使用 ENUM 來存放避免使用NULL字段,很難查詢優化且占用額外索引空間3)字符編碼同樣的內容使用不同字符集表示所占用的空間大小會有較大的差異,所以通過使用合適的字符集,可以幫助 我們盡可能減少數據量,進而減少IO操作次數。1.純拉丁字符能表示的內容,選擇 latin1 字符編碼2.中文可選用utf-83.MySQL的數據類型可以精確到字段,所以當我們需要大型數據庫中存放多字節數據的時候,可以通過對 不同表不同字段使用不同的數據類型來較大程度減小數據存儲量,進而降低 IO 操作次數并提高緩存命中率Sql優化1) 只返回需要的數據a) 不要寫SELECT *的語句b) 合理寫WHERE子句,不要寫沒有WHERE的SQL語句。2) 盡量少做重復的工作 可以合并一些sql語句3) 適當建立索引(不是越多越好)但以下幾點會進行全表掃描 a) 左模糊查詢’%...’ b) 使用了不等操作符!= c) Or使用不當,or兩邊都必須有索引才行 d) In 、not in e) Where子句對字段進行表達式操作 f) 對于創建的復合索引(從最左邊開始組合),查詢條件用到的列必須從左邊開始不能間隔。否則無效, 復合索引的結構與電話簿類似 g) 全文索引:當于對文件建立了一個以詞庫為目錄的索引(文件大全文索引比模糊匹配效果好)能在char、varchar、text類型的列上面創建全文索引MySQL 5.6 Innodb引擎也能進行全文索引如果列類型是字符串,但在查詢時把一個數值型常量賦值給了一個字符型的列名name,那么雖然在name列上 有索引,但是也沒有用到。4) 使用join代替子查詢5) 使用union代替手動創建臨時表索引優化一、 創建索引,以下情況不適合建立索引 表記錄太少 經常插入、刪除、修改的表 數據重復且分布平均的表字段二、 復合索引 如果一個表中的數據在查詢時有多個字段總是同時出現則這些字段就可以作為復合索引索引 索引是對數據庫表中一列或多列的值進行排序的一種結構。優點: 大大加快數據的檢索速度 創建唯一性索引,保證數據庫表中每一行數據的唯一性 可以加速表和表之間的連接缺點: 索引需要占物理空間。 當對表中的數據進行增加、刪除和修改的時候,索引也要動態的維護, 降低了數據的維護速度。索引分類: 普通索引 create index zjj_temp_index_1 on zjj_temp_1(first_name); drop index zjj_temp_index_1;唯一索引,索引列的值必須唯一,但允許有空值 create unique index zjj_temp_1 on zjj_temp_1(id);主鍵索引,它是一種特殊的唯一索引,不允許有空值。組合索引事務數據庫事務(Database Transaction) ,是指作為單個邏輯工作單元執行的一系列操作,要么完全地執行, 要么完全地不執行。 四大特征:(1)原子性 事務必須是原子工作單元;對于其數據修改,要么全都執行,要么全都不執行。(2)一致性 事務的一致性指的是在一個事務執行之前和執行之后數據庫都必須處于一致性狀態。事務執行的結果必須是 使數據庫從一個一致性狀態變到另一個一致性狀態。(3) 隔離性(關于事務的隔離性數據庫提供了多種隔離級別) 一個事務的執行不能干擾其它事務。即一個事務內部的操作及使用的數據對其它并發事務是隔離的,并發執行 的各個事務之間不能互相干擾。(4)持久性 事務完成之后,它對于數據庫中的數據改變是永久性的。該修改即使出現系統故障也將一直保持。在介紹數據庫提供的各種隔離級別之前,我們先看看如果不考慮事務的隔離性,會發生的幾種問題:臟讀 臟讀是指在一個事務處理過程里讀取了另一個未提交的事務中的數據。不可重復讀幻讀幻讀和不可重復讀都是讀取了另一條已經提交的事務,不可重復讀重點在于update和delete,而幻讀的重點 在于insert。現在來看看MySQL數據庫為我們提供的四種隔離級別: ① Serializable (串行化):可避免臟讀、不可重復讀、幻讀的發生。 ② Repeatable read (可重復讀):可避免臟讀、不可重復讀的發生。 ③ Read committed (讀已提交):可避免臟讀的發生。 ④ Read uncommitted (讀未提交):最低級別,任何情況都無法保證。在MySQL數據庫中默認的隔離級別為Repeatable read (可重復讀)。鎖模式包括: 共享鎖:(讀取)操作創建的鎖。其他用戶可以并發讀取數據,但任何事物都不能獲取數據上的排它鎖,直到 已釋放所有共享鎖。排他鎖(X鎖):對數據A加上排他鎖后,則其他事務不能再對A加任任何類型的封鎖。獲準排他鎖的事務既能 讀數據,又能修改數據。鎖的粒度主要有以下幾種類型: 行鎖: 粒度最小,并發性最高 頁鎖:一次鎖定一頁。25個行鎖可升級為一個頁鎖。 表鎖:粒度大,并發性低 數據庫鎖:控制整個數據庫操作樂觀鎖:相對悲觀鎖而言,樂觀鎖假設認為數據一般情況下不會造成沖突,一般的實現樂觀鎖的方式就是記錄 數據版本。悲觀鎖:顧名思義,就是很悲觀,每次去拿數據的時候都認為別人會修改,所以每次在拿數據的時候都會 上鎖,傳統的關系型數據庫里邊就用到了很多這種鎖機制,比如行鎖,表鎖等,讀鎖,寫鎖等,都是在做操作 之前先上鎖。MyISAM、InnoDB區別MyISAM類型不支持事務處理等高級處理,而InnoDB類型支持。 MyISAM表不支持外鍵,InnoDB支持 MyISAM鎖的粒度是表級,而InnoDB支持行級鎖定。 MyISAM支持全文類型索引,而InnoDB不支持全文索引。(mysql 5.6后innodb支持全文索引) MyISAM相對簡單,所以在效率上要優于InnoDB,小型應用可以考慮使用MyISAM。當你的數據庫有大量的 寫入、更新操作而查詢比較少或者數據完整性要求比較高的時候就選擇innodb表。 當你的數據庫主要以查詢為主,相比較而言更新和寫 入比較少,并且業務方面數據完整性要求不那么嚴格, 就選擇mysiam表。

mysql常見的問題

什么是數據庫事務?要么全做要么全不做,是不可分割的.事務的開始和結束用戶是可以控制的,如果沒控制則由數據庫默認的劃分事務.(1)原子性指一個事務要么全執行,要么全不執行.也就是說一個事務不可能執行到一半就停止了.(2)一致性(3)獨立性(4)持久性事務運行成功之后數據庫的更新是永久的,不會無緣無故的回滾.執行數據庫查詢時候,如果查詢的數據有很多,假設有1000萬條,用什么方法可以提高查詢效率?在數據庫方面 或java代碼方面有什么優化辦法?1.在數據庫設計方面 (1)建立索引 (2)分區(比如說按時間分區) (3)選取最適用的字段屬性(盡量減少字段寬度和使用固定長度的字段)2.在數據庫I/O方面 (1)增加緩沖區 (2)如果涉及到表的級聯,最好不同的表放在不同的磁盤,以增加I/O速度3.Sql語句方法 (1)優化sql語句,減少比較次數,可用連表查詢來代替子查詢 (2)限制返回的條目數(mysql用limit) (3)有外鍵約束會影響插入和刪除性能,如果程序能夠保證數據的完整性,那在設計數據庫時就去掉外鍵 (比喻:就好比免檢產品,就是為了提高效率,充分相信產品的制造商)4.在java方面如果反復使用的查詢,可通過preparedstatement,因為他在運行前已經預編譯,只要運行就Ok了.分組:group by 列名 統計各個部門薪水大于5000的人數SELECT department , COUNT(money) from employee where money>=5000group by department;分頁:limit ()select * from table limit 5; --返回前5行 select * from table limit 0,5; --同上,返回前5行 select * from table limit 5,10; --返回6-15行排序:order by 列名 asc 和desc 不寫默認為升序前者是升序后者是降序第一步:查出各個部門的對應人數,把這個看做一個新表e1 select e.dep_id,count(name) num from employee e group by dep_id;什么是數據庫的三范式?第一范式(1NF):字段具有原子性,不可再分。所有關系型數據庫系統都滿足第一范式數據庫表中的字段都是單一屬性的,不可再分。例如,姓名字段,其中的姓和名必須作為一個整體如果要區分出姓和名,必須設計成兩個獨立的字段。第二范式(2NF):第二范式(2NF)是在第一范式(1NF)的基礎上建立起來的,即滿足第二范式(2NF) 必須先滿足第一范式(1NF)。第二范式(2NF)要求實體的屬性完全依賴于主關鍵字。所謂完全依賴是指不能存在僅依賴主關鍵字一部分的 屬性,如果存在,那么這個屬性和主關鍵字的這一部分應該分離出來形成一個新的實體,新實體與原實體之間 是一對多的關系。第三范式的要求如下:滿足第三范式(3NF)必須先滿足第二范式(2NF)。簡而言之,第三范式(3NF)要求 一個數據庫表中不包含已在其它表中已包含的非主關鍵字信息。union 與union all的區別union 在進行表鏈接后會篩選掉重復的記錄,所以在表鏈接后會對所產生的結果集進行排序運算,刪除重復 的記錄再返回結果。union all 則會顯示重復結果,只是簡單的兩個結果合并并返回.所以效率比union高,在保證沒有重復數據 的情況下用union all.select name from table1 union select name from table2;用一條 SQL 語句查詢出每門課都大于 80 分的學生姓名 分析:都大于80,他的反面就是<=80,我們可以先求出所有<=80的姓名,然后取反就可以了 所以sql語句 select name from student where name not in (select name from studentwhere fenshu <=80);一個用戶表中有一個積分字段,假如數據庫中有 100 多萬個用戶,若要在 多萬個用戶,若要在每年第一天 凌晨將積分清零,你將考慮什么,你將想什么辦法解決 每年第一天凌晨將積分清零,你將考慮什么,你將想 什么辦法解決? alter table drop column score; alter table add colunm score int;Class.forName()的作用?按參數中指定的字符串形式的類名去搜索并加載相應的類,如果該類字節碼已經被加載過,則返回代表該字節 碼的 Class 實例對象,否則,按類加載器的委托機制去搜索和加載該類,如果所有的類加載器都無法加載到 該類,則拋出 ClassNotFoundException。加載完這個 Class 字節碼后,接著就可以使用 Class 字節碼 的 newInstance 方法去創建該類的實例對象了。連接查詢分類:內連接、外連接、自然連接(略)、交叉連接(略)。內連接基本語法:左表 [inner] join 右表 on 左表.字段 = 右表.字段;從左表中取出每一條記錄,去右表中與所有的記錄進行匹配:匹配必須是某個條件在左表中與右表中相同最終 才會保留結果,否則不保留。外連接基本語法: 左表 left/right join 右表 on 左表.字段 = 右表.字段;left join: 左外連接(左連接), 以左表為主表right join: 右外連接(右連接), 以右表為主表以某張表為主,取出里面的所有記錄,然后每條與另外一張表進行連接:不管能不能匹配上條件,最終都會 保留。能匹配,正確保留;不能匹配,其他表的字段都置空 NULL。聯合查詢基本語法:Select 語句 1Union [union 選項]Select 語句 2……將多次查詢(多條 select 語句), 在記錄上進行拼接(字段不會增加),每一條 select 語句獲取的字段數 必須嚴格一致(但是字段類型無關)。應用:查詢同一張表,但是有不同的需求;查詢多張表,多張表的結構完全一致,保存的數據也是一樣的。索引如果說數據庫表中的數據是一本書,那么索引就是書的目錄。索引能夠讓我們快速的定位想要查詢的數據。索引的結構:BTree 索引和 Hash 索引。MyISAM 和 InnoDB 存儲引擎:只支持 BTREE 索引, 也就是說默認使用 BTREE,不能夠更換。MEMORY/HEAP 存儲引擎:支持 HASH 和 BTREE 索引。索引的分類:單列索引(普通索引,唯一索引,主鍵索引)、組合索引、全文索引、空間索引。數據庫引擎1.InnoDB:支持事務處理,支持外鍵,支持崩潰修復能力和并發控制。2.如果需要對事務的完整性要求比較高(比如銀行),要求實現并發控制(比如售票),那選擇 InnoDB 有很大的優勢。如果需要頻繁的更新、刪除操作的數據庫,也可以選擇 InnoDB,因為 支持事務的提交(commit)和回滾(rollback)。MEMORY:所有的數據都在內存中,數據的處理速度快,但是安全性不高。如果需要很快的讀寫速度, 對數據的安全性要求較低,可以選擇 MEMOEY。

?

總結

以上是生活随笔為你收集整理的数据库(MySQL)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。