mysql優化你瞭解嗎?

1、避免一些不走索引的查詢

1)避免在索引列上使用函數或者計算,如果這樣,優化器將不再使用索引而使用全表掃描:

Select * from  T where hh*10>1000;(低效,優化器不再使用索引)

Select * from T where hh>1000/10;(更高效,優化器將使用索引)

/*在student表的age上創建索引*/

create index index_age on student(age)

下面是走索引的

 

但是在索引列上計算就不走索引了

 

 

替換成下面的情況又走索引了

 

 

在索引列上使用函數查詢將不走索引(無意義,僅做示例)

 

 

 

2)避免在索引列上使用not,<>和!=,索引只知道什麼在表中,而不能告訴什麼不在表中,數據庫發現上面三種符號將不再使用索引,而是走全表掃描。

/*在student表的name上創建索引*/

create index index_name on student(name)

 

 

上面是走索引的,但是下面的情況就不走索引了

1.使用not關鍵字不走索引

 

2.使用!=是不走索引,走全表掃描

 

3.使用<>符號是不走索引的,走全表掃描

 

 

3)在使用like關鍵字時,如果將通配符“%”置於要查詢字段的前面那麼數據庫將走全表掃描而不走索引。

4)另一個方面,索引不是越多越好,索引雖然會提高select的效率,但是同時也降低了insert以及update的效率,因為insert或者update時有可能重建索引,這會導致時間的開銷。

2:sql語句改寫方面:

 

1)用exists代替in,可以提高查詢效率,例如:

 

Select * from emp where depid in (select depid from dep=’hh’);(更加低效)

 

Select * from emp where exists(select 1 from dep where emp.depid=id and dep=’hh’);(更加高效)

 

SELECT * FROM ACCOUNT

 

    WHERE AC_CODE

 

    NOT IN (

 

              SELECT CODE

 

              FROM GOODS

 

              WHERE NUM='001')       //低效

 

SELECT * FROM ACCOUNT

 

    WHERE NOT EXISTS

 

       (SELECT CODE

 

          FROM GOODS

 

          WHERE CODE=ACCOUNT.AC_CODE

 

           AND NUM='001')

 

2)如果一個select中要查詢出所有的列,使用*是很方便但是很低效,這是因為數據庫會查詢數據字典,將*依次轉換成所有的列名,非常耗時,如果要顯示全部列名則要手寫出全部列名。

 

3)Order by語句決定了返回的結果是如何排序的。如果Order by語句後面字段是非索引項那麼該查詢性能較低,解決的方式是重寫語句在order by後面使用索引。

4)使用表的別名,當sql語句連接多個表時,使用表的別名並且把別名置於每個列上,這樣可以減少解析時間減少有列名歧義帶來的語法錯誤。

5)使用OR關鍵字,查詢語句的查詢條件只有or關鍵字,而且or前後的兩個條件中的列都是索引時,索引才會生效,否則索引不會生效。

使用or關鍵字前面是索引列後面是非索引列不走索引

 

Or前後都是索引,查詢才走索引

 

使用union all ,一個走索引一個不走索引,效率也比全部不走索引要高

 

 

6)儘量避免全表掃描,在常用在where和order by後面的列創建索引。

 7)表適當宂餘。因為單表查詢比多表聯查的性能要高。比如:一個外賣系統,用户下單後手機通知用户,這時候需要查詢訂單表和用户表,性能較低,那麼我們就可以在訂單表上加用户ID和用户手機這兩個字段,性能回比多表連接查詢要高。

實驗表結構:

索引:

create index index_name on student(name)

create index index_age on student(age)

 

 

關鍵詞:索引 使用 查詢 select from where index 掃描 語句 student

相關推薦:

HBase之Table.put客户端流程(續)

帶着新人學springboot的應用08(springboot+jpa的集成)

網絡協議 10 - Socket 編程:實踐是檢驗真理的唯一標準

基於sentry的前端錯誤監控日誌系統(部署sentry服務器/前端項目部署)-讓前端最快的定位到生產問題

Windows環境下uiautomatorviewer進行元素定位

深入淺出經典面試題:從瀏覽器中輸入URL到頁面加載發生了什麼 - Part 3

.net core 2.x - docker-linux容器-持續集成(jenkins)

ELK+Kafka學習筆記之搭建ELK+Kafka日誌收集系統集羣

解決JDBC注入攻擊和模擬回滾數據

數據庫事務