MySQL 面試選擇題15道(答案解釋)

1、MySQL數據庫四種特性,不包括()

A.原子性

B.事務性

C.一致性

D.隔離性

解釋:事物的四種特性ACID,即:原子性、一致性、隔離性、持久性

2、MySQL報錯error 1062 的意思是()

A.連接數據庫失敗,沒有連接數據庫的權限

B.字段值重複,入庫失敗

C.未定義用戶對數據表的訪問權限

D.刪除數據庫文件失敗

解釋:error 1062是最容易遇到的錯誤,即主鍵衝突引起的從庫複製中斷

3、MySQL主從架構如下:

主庫 從庫

192.169.1.1 192.168.1.2

需要在從庫上採用mysqldump備份並記錄主庫binlog、Position點,需要加哪個參數(不考慮其他參數) ()

A.--master-date

B.--single-transaction

C.--dump-slave

D.--opt

解釋:如果在從庫備份並記錄主庫位點,需要加--dump-slave參數,一般添加新從庫時使用,但需要注意此參數會引起備份的從庫複製斷開。

4、以下哪個不能有效減小從庫延遲時間()

A.主庫進行update操作時where後條件沒有索引,添加索引

B.主庫有大事物,增加緩存,異步寫入數據庫,減少直接對db的大量寫入

C.主庫併發更新寫入頻繁,從庫設置innodb_flush_log_at_trx_commit=1及sync_binlog=1

D.數據庫中存在大量myisam表,修改表結構為innodb存儲引擎的表

解釋:主庫併發更新寫入頻繁,從庫設置這兩個參數0、0或者2、0;

innodb_flush_log_at_trx_commit=0 每秒將log_buffer刷新到logfile,並且將日誌同步刷新到磁盤。該模式下,在事務提交的時候,不會主動觸發寫入磁盤的操作;

innodb_flush_log_at_trx_commit=1 每次commit將log_buffer刷新到logfile,並且將日誌同步刷新到磁盤;

innodb_flush_log_at_trx_commit=2 每次commit將刷新到log_buffer,但是flush(刷到磁盤)操作並不會同時進行,每秒將日誌刷新到磁盤;

sync_binlog=0 像操作系統刷其他文件的機制一樣,MySQL不會同步到磁盤中去而是依賴操作系統來刷新binary log。

sync_binlog=1 MySQL在每寫N次二進制日誌binary log時,會使用fdatasync()函數將它的寫二進制日誌binary log同步到磁盤中去。如果啟用了autocommit,那麼每一個語句statement就會有一次寫操作;否則每個事務對應一個寫操作。

5、表test(a int,b int,time date)涉及以下3條sql:

select * from test where a=1 and b=1;

select * from test where b=1;

select * from test where b=1 order by time desc;

只建一個索引,如何建最優()

A.idx_ab(a,b)

B.idx_ba(b,a)

C.idx_abtime(a,b,time)

D.idx_btime(b,time)

解釋:在有order by排序時,排序字段必須要有索引,第一條sql創建idx_ab(a,b)最優,但是第二條sql用不到,而idx_ba(b,a)索引排序用不到,綜上idx_btime(b,time)最優

6、MySQL中InnoDB引擎的行鎖是通過加在什麼上完成(或稱實現)的:()

A.數據塊

B.索引值

解釋:索引值,行級鎖鎖的是這條記錄

7、關於MySQL權限說法正確的是()

A.管理權限(如super, process, file等)不能夠指定某個數據庫,on後面必須跟 *.*

B.如需要truncate權限只需授予drop權限

C.super權限允許用戶終止任何查詢,但不允許修改全局變量的set語句

D.建立一個用戶時,需要單獨授予usage連接權限

解釋:truncate權限需要create和drop權限;super權限允許用戶終止任何查詢;修改全局變量的SET語句建立一個用戶,就會自動授予其usage權限(默認授予),無需再單獨授予。

8、關於select count(*)和select count(1)以及select count(column)區別,說法錯誤的是()

A.如果表沒有主鍵, 那麼count(1)比count(*)快

B.如果表有主鍵,那主鍵作為count的條件時候count(主鍵)最快

C.如果表沒有主鍵,只有一個column的話,那count(column)最快

D.count(*)跟count(1)的結果一樣,都包括對NULL的統計,而count(column)是不包括NULL的統計

解釋:如果表沒有主鍵,只有一個column的話,那count(*)最快

9、使用SQL語句進行分組檢索時,為了去掉不滿足條件的分組,應當()

A.使用WHERE子句

B.在GROUP BY後面使用HAVING子句

C.先使用WHERE子句,再使用HAVING子句

D.先使用HAVING子句,再使用WHERE子句

解釋:GROUP BY HAVING分組後過濾固定格式

10、關於SQL優化,以下說明哪個是錯誤的()

A.類似分頁功能的SQL,建議先用主鍵關聯,然後返回結果集,效率會高很多

B.通常情況下,join的性能比較差,建議改造成子查詢寫法

C.多表聯接查詢時,關聯字段類型儘量一致,並且都要有索引

D.儘可能不使用TEXT/BLOB類型,確實需要的話,建議拆分到子表中,不要和主表放在一起,避免SELECT* 的時候讀性能太差

解釋:具體SQL具體分析,不一定join就比子查詢快

11、Linux操作系統下,關於MySQL大寫小問題正確的是()

A.column(包括別名)、index、storedroutine和event names的大小寫敏感

B.database、table(包括別名)的大小寫敏感性可以通過系統參數“lower_case_table_names”來配置,等於1時大小寫敏感

C.trigger、identifiers(標識符)的大小寫敏感性受lower_case_table_names參數影響

D.數據敏感性:校對字符集(Collation)可通過show collation查看,其中“_ci”代表case-insensitive大小寫不敏感,“_cs”代表case-sensitive大小寫敏感,“_bin”的大小寫敏感依賴於character的二進制編碼

解釋:column(包括別名)、index、storedroutine和event names不區分大小寫;lower_case_table_names = 1 表名存儲在磁盤是小寫的,但是比較的時候是不區分大小寫;.trigger、identifiers(標識符)的大小寫敏感性不受lower_case_table_names參數影響

12、MySQL delete from table where後哪項操作不會釋放磁盤物理空間()

A.optimize table tablename;

B.alter table tablename add column ;

C.alter table tablename engine=innodb;

D.rename table tablename to tablename_new;

解釋:前3個都會in-place數據,重新插入數據,從而達到釋放碎片的目的,第四個只是修改元數據

13、MySQL在RR事物隔離級別下,更新條件為索引字段,並非唯一索引(包括主鍵索引)時,會通過Next-Key Lock解決幻讀問題。以下哪項不會加此鎖()

A.Inser into…

B.Select… from… for update;

C.Update…from… where

D.Insert into T select … from S where…;

解釋:Inser into…只加行級鎖,RR隔離級別通過MVCC避免

14、MySQLSleep線程過多,以下操作不正確的是()

A.設置interactive_timeout參數,減小wait_timeout等待超時時間

B.php程序不要使用長連接,java程序調整連接池

C.打開mysql慢查詢

D.檢查應用連接情況,增加連接數

解釋:Sleep線程過多,主要是程序沒有發送請求,可以縮短空閒超時時間,也可以從程序端配置間隔探活,而增加連接數不會從根本達到優化效果

15、表結構如下:

CREATE TABLE `test` (

`id`int(11) NOT NULL AUTO_INCREMENT,

`uid`int(11) DEFAULT NULL,

`name`char(20) DEFAULT '0' NOT NULL,

`phone` int(11) DEFAULT NULL,

`email`varchar(20) DEFAULT NULL,

PRIMARYKEY (`id`),

KEY`idx_name` (`name`(5)),

KEY`idx_phone` (`phone`),

KEY`idx_email` (`email`)

) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULTCHARSET=utf8;

請問idx_name、idx_phone及idx_email索引長度分別是多少 ()

A.15,4,62

B.15,5,63

C.16,4,62

D.16,5,63

解釋:utf8佔3個字節,NULL佔一個字節,not null不佔用字節,int固定佔用4個字節,變長字段需要記錄長度佔用2個字節

idx_name(`name`(5)) 雖然name(5)只對前5個字符加索引 5*3 總共15;

idx_phone(`phone`) int固定4個字節,NULL佔一個字節,總共5;

idx_email (`email`) varchar(20) *3,NULL佔一個字節,變長字段需要記錄長度佔用2個字節,總共63


分享到:


相關文章: