阿里Python后端1w+薪资面试真题!(附带准答案)offer轻松拿到手
生活随笔
收集整理的這篇文章主要介紹了
阿里Python后端1w+薪资面试真题!(附带准答案)offer轻松拿到手
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. 列舉 創建索引但是無法命中索引的8種情況
/*這里有我自己整理了一套最新的python系統學習教程, 包括從基礎的python腳本到web開發、爬蟲、數據分析、 數據可視化、機器學習等。小編這里推薦加小編的python學習群:895,817, 687 */- like '%xx'select * from tb1 where name like '%cn';- 使用函數select * from tb1 where reverse(name) = 'wupeiqi';- orselect * from tb1 where nid = 1 or email = 'seven@live.com';特別的:當or條件中有未建立索引的列才失效,以下會走索引select * from tb1 where nid = 1 or name = 'seven';select * from tb1 where nid = 1 or email = 'seven@live.com' and name = 'alex'- 類型不一致如果列是字符串類型,傳入條件是必須用引號引起來,不然...select * from tb1 where name = 999;- !=select * from tb1 where name != 'alex'特別的:如果是主鍵,則還是會走索引select * from tb1 where nid != 123- >select * from tb1 where name > 'alex'特別的:如果是主鍵或索引是整數類型,則還是會走索引select * from tb1 where nid > 123select * from tb1 where num > 123- order byselect email from tb1 order by name desc;當根據索引排序時候,選擇的映射如果不是索引,則不走索引特別的:如果對主鍵排序,則還是走索引:select * from tb1 order by nid desc;2. 數據庫優化方案?
1. 避免全表掃描,首先應考慮在 where 及 orderby 涉及的列上建立索引。2. 避免在 where 子句中對字段進行 null 值判斷,導致引擎放棄使用索引而進行全表掃描 3. 避免在 where 子句中使用 != 或>操作符,引擎將放棄使用索引而進行全表掃描。4. 避免在 where 子句中使用or 來連接條件5. 慎用in 和 not, 可以用 exists 代替 in6. 慎用 like 'XXX%',要提高效率,可以全文檢索。7. 應盡量避免在 where 子句中對字段進行表達式操作,如:select id from t where num/2=100應改為select id from t where num=100*28. 避免在where子句中對字段進行函數操作select id from t where substring(name,1,3)='abc' 改為:select id from t where name like 'abc%'9. 在使用索引字段作為條件時,如果該索引是復合索引,那么必須使用到該索引中的第一個字段作為條件時才能保證系統使用該索引,否則該索引將不會被使用,并且應盡可能的讓字段順序與索引順序相一致。(索引的最左前綴原則) 10. 并不是所有索引對查詢都有效,SQL是根據表中數據來進行查詢優化的,當索引列有大量數據重復時,SQL查詢可能不會去利用索引,如一表中有字段sex,male、female幾乎各一半,那么即使在sex上建了索引也對查詢效率起不了作用。11. 索引不是越多越好,索引可以提高select 的效率,同時也降低 insert 及 update 的效率,因為 insert 或 update 時有可能會重建索引。12. 任何地方都不要使用 select * from t ,用具體的字段列表代替“*”13. 避免頻繁創建和刪除臨時表,以減少系統表資源的消耗。14. 在新建臨時表時,如果一次性插入數據量很大,那么可以使用 select into 代替 create table,避免造成大量 log ,以提高速度;如果數據量不大,為了緩和系統表的資源,應先create table,然后insert。15. 盡量避免向客戶端返回大數據量,若數據量過大,應該考慮相應需求是否合理。數據庫中的數據在未進行分庫分表的情況下,隨著時間和業務的發展,庫中的表會越來越多,表中的數據量也會越來越大,相應地,數據操作,增刪改查的開銷也會越來越大16. 讀寫分離。通過數據庫配置設置, mysql復制時,產生了多個數據副本(備庫),為減少服務器壓力,備庫用于處理讀操作,主庫可同時處理讀寫。備庫的復制是異步的,無法實時同步,讀寫分離的主要難點也在于備庫上的臟數據。通常如果使用備庫進行讀,一般對數據的實時性要求不能太高。17. 分庫、分表。分庫:當數據庫中的表太多,可以考慮將表分到不同的數據庫分表水平分表:將一些列分到另一張表垂直分表:將歷史信息分到另一張表中,很久之前的記錄少有查詢18. 利用緩存存儲經常被查詢的數據。利用redis、memcache3. 1000w條數據,使用limit offset 分頁時,為什么越往后翻越慢?如何解決?
答案一:先查主鍵,在分頁。select * from tb where id in (select id from tb where limit 10 offset 30)答案二:按照也無需求是否可以設置只讓用戶看200頁答案三:記錄當前頁 數據ID最大值和最小值在翻頁時,根據條件先進行篩選;篩選完畢之后,再根據limit offset 查詢。select * from (select * from tb where id > 22222222) as B limit 10 offset 0如果用戶自己修改頁碼,也可能導致慢;此時對url種的頁碼進行加密(rest framework )4. redis中數據庫默認是多少個db 及作用?
Redis默認支持16個數據庫(可以通過配置文件支持更多,無上限),可以通過配置databases來修改這一數字。客戶端與Redis建立連接后會自動選擇0號數據庫,不過可以隨時使用SELECT命令更換數據庫Redis支持多個數據庫,并且每個數據庫的數據是隔離的不能共享,并且基于單機才有,如果是集群就沒有數據庫的概念。5. 如果redis中的某個列表中的數據量非常大,如果實現循環顯示每一個值?
通過scan_iter分片取,減少內存壓力scan_iter(match=None, count=None)增量式迭代獲取redis里匹配的的值# match,匹配指定key# count,每次分片最少獲取個數r = redis.Redis(connection_pool=pool)for key in r.scan_iter(match='PREFIX_*', count=100000):print(key)總結
以上是生活随笔為你收集整理的阿里Python后端1w+薪资面试真题!(附带准答案)offer轻松拿到手的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 一道十分有趣的概率题!3局2胜和5局3胜
- 下一篇: 1024-程序员节快乐!给大家发福利啦!