1. 程式人生 > 其它 >開發筆記 -- mysql常見問題

開發筆記 -- mysql常見問題

1.資料庫事務的四個特性及含義 資料庫事務transanction正確執行的四個基本要素。ACID,原子性(Atomicity)、一致性(Correspondence)、隔離性(Isolation)、永續性(Durability)。 原子性:整個事務中的所有操作,要麼全部完成,要麼全部不完成,不可能停滯在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。 一致性:在事務開始之前和事務結束以後,資料庫的完整性約束沒有被破壞。 隔離性:隔離狀態執行事務,使它們好像是系統在給定時間內執行的唯一操作。如果有兩個事務,執行在相同的時間內,執行 相同的功能,事務的隔離性將確保每一事務在系統中認為只有該事務在使用系統。這種屬性有時稱為序列化,為了防止事務操作間的混淆,必須序列化或序列化請 求,使得在同一時間僅有一個請求用於同一資料。 永續性:在事務完成以後,該事務所對資料庫所作的更改便持久的儲存在資料庫之中,並不會被回滾。   2、一個6億的表a,一個3億的表b,通過外來鍵tid關聯,你如何最快的查詢出滿足條件的第50000到第50200中的這200條資料記錄。 解析:此題可以的關鍵是一個limit。LIMIT 子句可以被用於強制 SELECT 語句返回指定的記錄數。LIMIT 接受一個或兩個數字引數。引數必須是一個整數常量。如果給定兩個引數,第一個引數指定第一個返回記錄行的偏移量,第二個引數指定返回記錄行的最大數目。初始記錄行的偏移量是 0(而不是 1) 答: 1、如果A表TID是自增長,並且是連續的,B表的ID為索引 答:select * from a,b where a.tid = b.id and a.tid>500000 limit 200; 2、如果A表的TID不是連續的,那麼就需要使用覆蓋索引.TID要麼是主鍵,要麼是輔助索引,B表ID也需要有索引。 答:select * from b , (select tid from a limit 50000,200) a where b.id = a .tid; 3、用一條SQL 語句 查詢出每門課都大於80 分的學生姓名
name kecheng fenshu
張三 語文 81
張三 數學 75
李四 語文 76
李四 數學 90
王五 語文 81
王五 數學 100
王五 英語 90
建表語句: CREATE TABLE chengji( name varchar(20), kecheng varchar(20), fenshu int ); INSERT INTO chengji VALUES('張三','語文',81),('張三','數學',75),('李四','語文',76),('李四','數學',90),('王五','語文',81),('王五','數學',100),('王五','英語',90); SELECT DISTINCT NAME FROM chengji WHERE NAME NOT IN (SELECT DISTINCT NAME FROM chengji WHERE fenshu <=80);       4、根據以下三張表處理給出的題目:
CARD: 借書卡(表)  CNO 卡號,NAME 姓名,CLASS班級
BOOKS:圖書(表) BNO  書號,BNAME 書名, AUTHOR 作者,PRICE 單價,QUANTITY 庫存冊數
BORROW:借書記錄(表) CNO 借書卡號,BNO 書號,RDATE 還書日期
備註:限定每人每種書只能借一本;庫存冊數隨借書、還書而改變。 4.1、找出借書超過5本的讀者,輸出借書卡號及所借圖書冊數。 · SELECT CNO,借圖書冊數=COUNT(*) FROM BORROW GROUP BY CNO HAVING COUNT(*)>5 ; 4.2、查詢借閱了"水滸"一書的讀者,輸出姓名及班級。 SELECT * FROM CARD c WHERE EXISTS (SELECT * FROM BORROW a,BOOKS b  WHERE a.BNO=b.BNO AND b.BNAME=N'水滸'  AND a.CNO=c.CNO); 4.3、查詢書名包括"網路"關鍵詞的圖書,輸出書號、書名、作者。 SELECT BNO,BNAME,AUTHOR FROM BOOKS WHERE BNAME LIKE N'%網路%'; 4.4、從BOOKS表中刪除當前無人借閱的圖書記錄。 DELETE A FROM BOOKS a WHERE NOT EXISTS(   SELECT * FROM BORROW   WHERE BNO=a.BNO) 4.5、將"C01"班同學所借圖書的還期都延長一週。 UPDATE b SET RDATE=DATEADD(Day,7,b.RDATE) FROM CARD a,BORROW b WHERE a.CNO=b.CNO   AND a.CLASS=N'C01'; 4.6、從BOOKS表中刪除當前無人借閱的圖書記錄。 DELETE A FROM BOOKS a WHERE NOT EXISTS(   SELECT * FROM BORROW   WHERE BNO=a.BNO)    注:DELETE中不允許使用別名,所以別名要在FROM中設定。   5、Mysql的技術特點是什麼? 答:Mysql資料庫軟體是一個客戶端或伺服器系統,其中包括:支援各種客戶端程式和庫的多執行緒SQL伺服器、不同的後端、廣泛的應用程式程式設計介面和管理 工具。   6、無法登入MySQL會有哪寫原因導致? 答: 1、服務未啟用 2、遠端連線許可權被關或一直為開放。 3、登入mysql時的使用者沒有登入許可權 4、客戶端與服務端的埠不一致 5、網路原因導致的通訊故障,或服務端防火牆未開放資料庫埠。   7、CHAR和VARCHAR的區別? 答: CHAR和VARCHAR型別在儲存和檢索方面有所不同 • CHAR列長度固定為建立表時宣告的長度,長度值範圍是1到255當CHAR值被儲存時,它們被用空格填充到特定長度,檢索CHAR值時需刪除尾隨空格。VARCHAR和CHAR的使用方面在於設計表之初的設計,兩者各有千秋,VARCHAR比CHAR更省空間,但效率上略微的低於CHAR。   8、drop,delete與truncate的區別 答:drop直接刪掉表 truncate刪除表中資料,再插入時自增長id又從1開始 delete刪除表中資料,可以加where字句。 (1) DELETE語句執行刪除的過程是每次從表中刪除一行,並且同時將該行的刪除操作作為事務記錄在日誌中儲存以便進行進行回滾操作。TRUNCATE TABLE 則一次性地從表中刪除所有的資料並不把單獨的刪除操作記錄記入日誌儲存,刪除行是不能恢復的。並且在刪除的過程中不會啟用與表有關的刪除觸發器。執行速度快。   (2) 表和索引所佔空間。當表被TRUNCATE 後,這個表和索引所佔用的空間會恢復到初始大小,而DELETE操作不會減少表或索引所佔用的空間。drop語句將表所佔用的空間全釋放掉。   (3) 一般而言,drop > truncate > delete   (4) 應用範圍。TRUNCATE 只能對TABLE;DELETE可以是table和view   (5) TRUNCATE 和DELETE只刪除資料,而DROP則刪除整個表(結構和資料)。   9、公司的資料庫現不支援emoji表情,如何解決? 答:入股是utf8字符集的話,需要升級至utf8_mb4即可。   10、描述下過往工作經驗中mysql資料庫的開發規範。 答:(網上很多) 命名規範 庫名、表名、欄位名必須使用小寫字母,並採用下劃線分割 MySQL有配置引數lower_case_table_names=1,即庫表名以小寫儲存,大小寫不敏感。如果是0,則庫表名以實際情況儲存,大小寫敏感;如果是2,以實際情況儲存,但以小寫比較。 如果大小寫混合使用,可能存在abc,Abc,ABC等多個表共存,容易導致混亂。 欄位名顯示區分大小寫,但實際使⽤時不區分,即不可以建立兩個名字一樣但大小寫不一樣的欄位。 為了統一規範, 庫名、表名、欄位名使用小寫字母。 庫名以 d 開頭,表名以 t 開頭,欄位名以 f_ 開頭 比如表 t_crm_relation,中間的 crm 代表業務模組名 檢視以view_開頭,事件以event_開頭,觸發器以trig_開頭,儲存過程以proc_開頭,函式以func_開頭 普通索引以idx_col1_col2命名,唯一索引以uk_col1_col2命名(可去掉f_公共部分)。如 idx_companyid_corpid_contacttime(f_company_id,f_corp_id,f_contact_time) 庫名、表名、欄位名禁止超過32個字元,需見名知意 庫名、表名、欄位名支援最多64個字元,但為了統一規範、易於辨識以及減少傳輸量,禁止超過32個字元 臨時庫、表名須以tmp加日期為字尾 如 t_crm_relation_tmp0425。備份表也類似,形如 _bak20160425 。 按日期時間分表須符合_YYYY[MM][DD]格式 這也是為將來有可能分表做準備的,比如t_crm_ec_record_201403,但像 t_crm_contact_at201506就打破了這種規範。 不具有時間特性的,直接以 t_tbname_001 這樣的方式命名。 11、如何通過Unix shell 登入 MySQL? 答:/bin/mysql -h hostname | host_ip -u {userName} -p port   12、LIKE宣告中的%和_是什麼意思? 答:%對應於0個或更多字元,_只是LIKE語句中的一個字元。   13、如何在Unix和Mysql時間戳之間進行轉換? 答: UNIX_TIMESTAMP是從Mysql時間戳轉換為Unix時間戳的命令 FROM_UNIXTIME是從Unix時間戳轉換為Mysql時間戳的命令 14、列對比運算子是什麼?   答:在SELECT語句的列比較中使用=,<>,<=,<,> =,>,<<,>>,<=>,AND,OR或LIKE運算子。   15、MySQL查詢語句中是否區分大小寫? 答:要根據作業系統而定。windows中的MySQL查詢語句無需區分大小寫。但在Linux系統中需要區分大小寫。 在Linxu系統中的規則如下: 1、資料庫名與表名是嚴格區分大小寫的; 2、表的別名是嚴格區分大小寫的; 3、列名與列的別名在所有的情況下均是忽略大小寫的; 4、變數名也是嚴格區分大小寫的; 16、什麼樣的物件可以使用CREATE語句建立? 答: DATABASE EVENT FUNCTION INDEX PROCEDURE TABLE TRIGGER USER VIEW 17、MYSQL支援事務嗎? 答: 在預設模式下,MYSQL是autocommit模式的,所有的資料庫更新操作都會即時提交,所以在預設情況下,mysql是不支援事務的。 但是如果你的MYSQL表型別是使用InnoDB Tables 或 BDB tables的話,你的MYSQL就可以使用事務處理,使用SET AUTOCOMMIT=0就可以使MYSQL 允許在非autocommit模式,在非autocommit模式下,你必須使用COMMIT來提交你的更改,或者用ROLLBACK來回滾你的更改。 18、MYSQL資料表在什麼情況下容易損壞? 答: 伺服器突然斷電導致資料檔案損壞。 強制關機,沒有先關閉mysql 服務等。 19、超鍵、候選鍵、主鍵、外來鍵 答: 超鍵:在關係中能唯一標識元組的屬性集稱為關係模式的超鍵。一個屬性可以為作為一個超鍵,多個屬性組合在一起也可以作為一個超鍵。超鍵包含候選 鍵和主鍵。 候選鍵:是最小超鍵,即沒有冗餘元素的超鍵。 主鍵:資料庫表中對儲存資料物件予以唯一和完整標識的資料列或屬性的組合。一個數據列只能有一個主鍵,且主鍵的取值不能缺失,即不能為空值 (Null)。 外來鍵:在一個表中存在的另一個表的主鍵稱此表的外來鍵。 20、什麼是事務?什麼是鎖? 答: 事務:就是被繫結在一起作為一個邏輯工作單元的SQL 語句分組,如果任何一個語句操作失敗那麼整個操作就被失敗,以後操作就會回滾到操作前狀態, 或者是上有個節點。為了確保要麼執行,要麼不執行,就可以使用事務。要將有組語句作為事務考慮,就需要通過ACID 測試,即原子性,一致性,隔離 性和永續性。 鎖:在所以的 DBMS 中,鎖是實現事務的關鍵,鎖可以保證事務的完整性和併發性。與現實生活中鎖一樣,它可以使某些資料的擁有者,在某段時間內不 能使用某些資料或資料結構。當然鎖還分級別的。 21、出現Lock wait timeout exceeded; try restarting transaction是什麼原因? 答: 是鎖等待超時。是當前事務在等待其它事務釋放鎖資源造成的。通過select * from information_schema.innodb_trx;可以檢視到有哪些事務未釋放資源。 通過kill+執行緒號可以解決。 例如kill+79幹掉對應的執行緒。 22、Nonrepeatable Read是什麼意思?與資料庫、MySQL有什麼關係? 答: Nonrepeatable Read --  不可重複讀,是一種事務執行緒安全的問題。 在MySQL中僅是一種隔離級別,MySQL的預設隔離級別是 -- 可重複讀 -- Repeatable read 23、mysql複雜更新(關聯更新) update basic_user a join auth_provider b on a.id = b.auth_user_id and b.remark = '小匠' and b.user_type_id = '313347464344109056' set a.nickname = b.auth_name;