當使用索引列查詢的時候,盡量不要使用表示式,應該把計算放到業務層而不是資料庫層。
例如下面這兩個sql語句,顯然應該避免的是第二種 where字句後面 寫計算的
通過執行計畫可以看出這個sql的type是const
而這個寫表示式的是 index,const比index執行效率高
盡量使用主鍵查詢,而不是其他索引,因為主鍵查詢不會觸發回表。
使用索引掃瞄來做排序:
mysql有兩種方式可以生成有序的結果:通過排序操作或者按索引順序掃瞄,如果explain出來的type列的值為index,則說明mysql使用了索引掃瞄來做排序
掃瞄索引本身是很快的,因為只需要從一條索引記錄移動到緊接著的下一條記錄。但如果索引不能覆蓋查詢所需的全部列,那麼就不得不每掃瞄一條索引記錄就得回表查詢一次對應的行,這基本都是隨機io,因此按索引順序讀取資料的速度通常要比順序地全表掃瞄慢
mysql可以使用同乙個索引即滿足排序,又用於查詢行,如果可能的話,設計索引時應該盡可能地同時滿足這兩種任務。
只有當索引的列順序和order by子句的順序完全一致,並且所有列的排序方式都一樣時(都是desc或都是asc),mysql才能夠使用索引來對結果進行排序,如果查詢需要關聯多張表,則只有當orderby子句引用的字段全部為第一張表時,才能使用索引做排序。order by子句和查詢型查詢的限制是一樣的,需要滿足索引的最左字首的要求,否則,mysql都需要執行順序操作,而無法利用索引排序。
union all , in , or 都能使用索引的情況下,推薦使用 in
更新十分頻繁,資料區分度不高的字段不宜建立索引:
更新會變更b+樹,更新頻繁的字段建立索引會大大降低資料庫效能,更新的話會造成頁**和頁合併。
類似於性別這類區分度不大的屬性,建立索引是沒有意義的,不能有效過濾資料,想一下,性別就男和女,本身就能區分資料了,建立索引沒什麼意義,索引在id這種欄位上建立的話,sql上where id = ? 這種的話,是直接可以檢索的,而在性別上,就乙個分支,男和女,沒有太多的樹。一般區分度在80%以上的時候就可以建立索引,區分度可以使用count(distinct(列名))/count(*)來計算。
建立索引的列,不允許為null。如果為null則會出現不符合預期的結果。
如果明確知道只有一條結果返回,limit 1 能夠提高效率。因為用了limit 1之後 索引指標不會往下進行判斷,如果下面還有資料,如果沒有用limit 1 的話,還是會繼續往下判斷的。
mysql中性別 在資料庫中儲存性別(性別)
8 個答案 答案 0 得分 164 已經有iso標準 無需發明自己的方案 根據標準,該列應該被稱為 而 最接近 的資料型別將是tinyint,並且具有check約束或查詢表。答案 1 得分 74 我將該欄目稱為 性別 data type bytes taken number range of val...
用mysql觸發器性別範圍 十三 MySQL觸發器
一 建立觸發器 觸發器是與表有關的資料庫物件,在滿足定義條件時觸發,並執行觸發器中定義的語句集合。觸發器的這種特性可以協助應用在資料庫端確保資料的完整性。建立只有乙個執行語句的觸發器 建立觸發器的語法 create triggertrigger name trigger time trigger e...
mysql使用判斷 MySQL使用判斷
1.case語法 在第乙個方案的返回結果中,value compare value。而第二個方案的返回結果是第一種情況的真實結果。如果沒有匹配的結果值,則返回結果為else後的結果,如果沒有else 部分,則返回值為 null。mysql select case 1 when 1 then one ...