六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網中心:是一個免費提供流行視頻軟件教程、在線學習分享的學習平臺!

MYSQL查詢怎么優化?mysql查詢優化的方法介紹

[摘要]本篇文章給大家帶來的內容是關于python中進程池的簡單實現代碼,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。1. 在所有用于where,order by和group by的列上添...
本篇文章給大家帶來的內容是關于python中進程池的簡單實現代碼,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

1. 在所有用于where,order bygroup by的列上添加索引

索引除了能夠確保唯一的標記一條記錄,還能是MySQL服務器更快的從數據庫中獲取結果。索引在排序中的作用也非常大。

Mysql的索引可能會占據額外的空間,并且會一定程度上降低插入,刪除和更新的性能。但是,如果你的表格有超過10行數據,那么索引就能極大的降低查找的執行時間。

強烈建議使用“最壞情況的數據樣本”來測試MySql查詢,從而更清晰的了解查詢在生產中的行為方式。

假設你正在一個超過500行的數據庫表中執行如下的查詢語句:

mysql>select customer_id, customer_name from customers where customer_id='345546'

上述查詢會迫使Mysql服務器執行一個全表掃描來獲得所查找的數據。

型號,Mysql提供了一個特別的Explain語句,用來分析你的查詢語句的性能。當你將查詢語句添加到該關鍵詞后面時,MySql會顯示優化器對該語句的所有信息。

如果我們用explain語句分析一下上面的查詢,會得到如下的分析結果:

mysql> explain select customer_id, customer_name from customers where customer_id='140385';
+----+-------------+-----------+------------+------+---------------+------+---------+------+------+----------+-------------+
  id   select_type   table       partitions   type   possible_keys   key    key_len   ref    rows   filtered   Extra        
+----+-------------+-----------+------------+------+---------------+------+---------+------+------+----------+-------------+
   1   SIMPLE        customers   NULL         ALL    NULL            NULL   NULL      NULL    500      10.00   Using where  
+----+-------------+-----------+------------+------+---------------+------+---------+------+------+----------+-------------+

可以看到,優化器展示出了非常重要的信息,這些信息可以幫助我們微調數據庫表。首先,MySql會執行一個全表掃描,因為key列為Null。其次,MySql服務器已經明確表示它將要掃描500行的數據來完成這次查詢。

為了優化上述查詢,我們只需要在customer_id這一列上添加一個索引m即可:

mysql> Create index customer_id ON customers (customer_Id);
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

如果我們再次執行explain語句,會得到如下結果:

mysql> Explain select customer_id, customer_name from customers where customer_id='140385';
+----+-------------+-----------+------------+------+---------------+-------------+---------+-------+------+----------+-------+
  id   select_type   table       partitions   type   possible_keys   key           key_len   ref     rows   filtered   Extra  
+----+-------------+-----------+------------+------+---------------+-------------+---------+-------+------+----------+-------+
   1   SIMPLE        customers   NULL         ref    customer_id     customer_id   13        const      1     100.00   NULL   
+----+-------------+-----------+------------+------+---------------+-------------+---------+-------+------+----------+-------+

從上述的輸出結果,顯然MySQL服務器會使用索引customer_id來查詢表格。可以看需要掃描的行數為1。雖然我只是在一個行數為500的表格中執行這條查詢語句,索引在檢索一個更大的數據集的時候優化程度更加明顯。

2. 用Union優化Like語句

有時候,你可能需要在查詢中使用or操作符進行比較。當or關鍵字在where子句中使用頻率過高的時候,它可能會使MySQL優化器錯誤的選擇全表掃描來檢索記錄。union子句可以是查詢執行的更快,尤其是當其中一個查詢有一個優化索引,而另一個查詢也有一個優化索引的時候。

比如,在first_namelast_name上分別存在索引的情況下,執行如下查詢語句:

mysql> select * from students where first_name like 'Ade%' or last_name like 'Ade%'

上述查詢和下面使用union合并兩條充分利用查詢語句的查詢相比,速度慢了許多。

mysql> select * from students where first_name like 'Ade%' union all select * from students where last_name like 'Ade%'

3. 避免使用帶有前導通配符的表達式

當查詢中存在前導通配符時,Mysql無法使用索引。以上面的student表為例,如下的查詢會導致MySQL執行全表掃描,及時first_name字段上加了索引。

mysql> select * from students where first_name like '%Ade'

使用explain分析得到如下結果:

mysql> explain select * from students where first_name like  '%Ade'  ;
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------------+
  id   select_type   table      partitions   type   possible_keys   key    key_len   ref    rows   filtered   Extra        
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------------+
   1   SIMPLE        students   NULL         ALL    NULL            NULL   NULL      NULL    500      11.11   Using where  
+----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------------+

如上所示,Mysql將掃描全部500行數據,這將使得查詢極其緩慢。

4. 充分利用MySQL的全文檢索

如果你正面臨著使用通配符查詢數據,但是并不想降低數據庫的性能,你應當考慮使用MySQL的全文檢索(FTS),因為它比通配符查詢快得多。除此以外,FTS還能夠返回質量更好的相關結果。

添加一個全文檢索索引到student樣表上的語句如下:

mysql> alter table students add fulltext(first_name, last_name)';
mysql> select * from students where match(first_name, last_name) against ('Ade');

在上面的例子中,我們針對搜索關鍵字Ade指定了想要匹配的列(first_name, last_name)。如果查詢優化器如上語句的執行情況,將得到下面的結果:

mysql> explain Select * from students where match(first_name, last_name) AGAINST ('Ade');
+----+-------------+----------+------------+----------+---------------+------------+---------+-------+------+----------+-------------------------------+
  id   select_type   table      partitions   type       possible_keys   key          key_len   ref     rows   filtered   Extra                          
+----+-------------+----------+------------+----------+---------------+------------+---------+-------+------+----------+-------------------------------+
   1   SIMPLE        students   NULL         fulltext   first_name      first_name   0         const      1     100.00   Using where; Ft_hints: sorted  
+----+-------------+----------+------------+----------+---------------+------------+---------+-------+------+----------+-------------------------------+

5. 優化數據庫架構

規范化

首先,規范化所有數據庫表,即使可能會有些損失。比如,如果你需要創建兩張表分別用來記錄customers和orders數據,你應當在order表上用顧客id引用顧客,而不是反過來。下圖顯示了沒有任何數據冗余而設計的數據庫架構。

3913407516-5bb658292cf77_articlex.png

除此以外,對相似的值使用同一種數據類型類存儲。

使用最佳數據類型

MySQL支持各種數據類型,包括integer,float,double,date,datetime,varchar,text等。當設計數據庫表時,應當盡可能使用能夠滿足特性的最短的數據類型。

比如,如果你在設計一個系統用戶表,而該用戶數量不會超過100個人,你就應該對user_ud使用'TINYINT'類型,該類型的取值范圍為-128至128。如果一個字段需要存儲date型值,使用datetime類型比較好,因為在查詢的時候無需進行復雜的類型轉換。

當值全為數字類型時,使用Integer。在進行計算時,Integer類型的值比文本類型的值速度更快。

避免NULL

NULL指該列沒有任何值。你應當盡可能的避免這類型的值因為他們會損害數據庫結果。比如你需要獲得數據庫中所有訂單金額的和,但是某個訂單記錄中金額為null,如果不注意空指針,很有可能導致計算結果出現異常。在某些情況下,你可能需要為列定義一個默認值。

以上就是MYSQL查詢怎么優化?mysql查詢優化的方法介紹的詳細內容,更多請關注php中文網其它相關文章!


學習教程快速掌握從入門到精通的SQL知識。




主站蜘蛛池模板: 日本综合欧美一区二区三区 | 欧美亚洲国产精品久久 | 最近免费的中文字幕一 | 欧美坐爱视频 | 日日干夜夜操视频 | 天天色天天综合网 | 亚洲狼人综合网 | 中文字幕午夜乱理片 | 在线免费观看a视频 | 中文亚洲| 亚洲性视频网站 | 亚洲自偷自偷图片在线高清 | 青草青草视频2免费观看 | 天天躁夜夜躁狠狠躁躁 | 亚洲欧美中文日韩v在线观看 | 天堂网视频在线 | 一级毛片在线免费视频 | 亚洲欧美无人区乱码 | 四虎剧院| 色姝姝在线影院 | 在线婷婷 | 香蕉中文在线 | 在线观看亚洲天堂 | 一级做a爰全过程免费视频 一级做a爰片性色毛片小说 | 天天操天天射天天爽 | 日韩毛片在线免费观看 | 色色视频网 | 羞羞一区二区三区四区片 | 涩五月婷婷 | 视频日韩p影院永久免费 | 欧美系列在线 | 中文在线√天堂 | 欧美一卡二卡3卡4卡无卡免费 | 午夜在线亚洲男人午在线 | 亚洲欧美国产人成在线app | 天天看片天天爽_免费播放 天天看片天天爽 | 亚洲91 | 一级黄色免费片 | 亚洲mv在线观看 | 夜间视频在线观看 | 亚洲伊人久久大香线蕉在观 |