激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術(shù)及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數(shù)據(jù)庫技術(shù)|

服務器之家 - 數(shù)據(jù)庫 - Mysql - 導致MySQL索引失效的幾種常見寫法

導致MySQL索引失效的幾種常見寫法

2020-12-08 23:32數(shù)據(jù)庫開發(fā) Mysql

隨著業(yè)務的增長,出現(xiàn)了大量的慢SQL,導致MySQL的CPU資源飆升,基于此,給大家簡單分享下這些比較使用的易于學習和使用的經(jīng)驗。

最近一直忙著處理原來老項目遺留的一些SQL優(yōu)化問題,由于當初表的設計以及字段設計的問題,隨著業(yè)務的增長,出現(xiàn)了大量的慢SQL,導致MySQL的CPU資源飆升,基于此,給大家簡單分享下這些比較使用的易于學習和使用的經(jīng)驗。

這次的話簡單說下如何防止你的索引失效

再說之前我先根據(jù)我最近的經(jīng)驗說下我對索引的看法,我覺得并不是所以的表都需要去建立索引,對于一些業(yè)務數(shù)據(jù),可能量比較大了,查詢數(shù)據(jù)已經(jīng)有了一點壓力,那么最簡單、快速的辦法就是建立合適的索引,但是有些業(yè)務可能表里就沒多少數(shù)據(jù),或者表的使用頻率非常不高的情況下是沒必要必須要去做索引的。就像我們有些表,2年了可能就10來條數(shù)據(jù),有索引和沒索引性能方面差不多多少。

索引只是我們優(yōu)化業(yè)務的一種方式,千萬為了為了建索引而去建索引。

下面是我此次測試使用的一張表結(jié)構(gòu)以及一些測試數(shù)據(jù)

  1. CREATE TABLE `user` (  
  2.   `id` int(5) unsigned NOT NULL AUTO_INCREMENT,  
  3.   `create_time` datetime NOT NULL,  
  4.   `name` varchar(5) NOT NULL,  
  5.   `age` tinyint(2) unsigned zerofill NOT NULL,  
  6.   `sex` char(1) NOT NULL,  
  7.   `mobile` char(12) NOT NULL DEFAULT '',  
  8.   `address` char(120) DEFAULT NULL,  
  9.   `height` varchar(10) DEFAULT NULL,  
  10.   PRIMARY KEY (`id`),  
  11.   KEY `idx_createtime` (`create_time`) USING BTREE,  
  12.   KEY `idx_name_age_sex` (`name`,`sex`,`age`) USING BTREE,  
  13.   KEY `idx_ height` (`height`) USING BTREE,  
  14.   KEY `idx_address` (`address`) USING BTREE,  
  15.   KEY `idx_age` (`age`) USING BTREE 
  16.  ENGINE=InnoDB AUTO_INCREMENT=261 DEFAULT CHARSET=utf8
  1. INSERT INTO `bingfeng`.`user`(`id`, `create_time`, `name`, `age`, `sex`, `mobile`, `address`, `height`) VALUES (1, '2019-09-02 10:17:47', '冰峰', 22, '男', '1', '陜西省咸陽市彬縣', '175'); 
  2. INSERT INTO `bingfeng`.`user`(`id`, `create_time`, `name`, `age`, `sex`, `mobile`, `address`, `height`) VALUES (2, '2020-09-02 10:17:47', '松子', 13, '女', '1', NULL, '180'); 
  3. INSERT INTO `bingfeng`.`user`(`id`, `create_time`, `name`, `age`, `sex`, `mobile`, `address`, `height`) VALUES (3, '2020-09-02 10:17:48', '蠶豆', 20, '女', '1', NULL, '180'); 
  4. INSERT INTO `bingfeng`.`user`(`id`, `create_time`, `name`, `age`, `sex`, `mobile`, `address`, `height`) VALUES (4, '2020-09-02 10:17:47', '冰峰', 20, '男', '17765010977', '陜西省西安市', '155'); 
  5. INSERT INTO `bingfeng`.`user`(`id`, `create_time`, `name`, `age`, `sex`, `mobile`, `address`, `height`) VALUES (255, '2020-09-02 10:17:47', '竹筍', 22, '男', '我測試下可以儲存幾個中文', NULL, '180'); 
  6. INSERT INTO `bingfeng`.`user`(`id`, `create_time`, `name`, `age`, `sex`, `mobile`, `address`, `height`) VALUES (256, '2020-09-03 10:17:47', '冰峰', 21, '女', '', NULL, '167'); 
  7. INSERT INTO `bingfeng`.`user`(`id`, `create_time`, `name`, `age`, `sex`, `mobile`, `address`, `height`) VALUES (257, '2020-09-02 10:17:47', '小紅', 20, '', '', NULL, '180'); 
  8. INSERT INTO `bingfeng`.`user`(`id`, `create_time`, `name`, `age`, `sex`, `mobile`, `address`, `height`) VALUES (258, '2020-09-02 10:17:47', '小鵬', 20, '', '', NULL, '188'); 
  9. INSERT INTO `bingfeng`.`user`(`id`, `create_time`, `name`, `age`, `sex`, `mobile`, `address`, `height`) VALUES (259, '2020-09-02 10:17:47', '張三', 20, '', '', NULL, '180'); 
  10. INSERT INTO `bingfeng`.`user`(`id`, `create_time`, `name`, `age`, `sex`, `mobile`, `address`, `height`) VALUES (260, '2020-09-02 10:17:47', '李四', 22, '', '', NULL, '165'); 

單個索引

1、使用!= 或者 <> 導致索引失效

  1. SELECT * FROM `user` WHERE `name` != '冰峰'; 

我們給name字段建立了索引,但是如果!= 或者 <> 這種都會導致索引失效,進行全表掃描,所以如果數(shù)據(jù)量大的話,謹慎使用

導致MySQL索引失效的幾種常見寫法

可以通過分析SQL看到,type類型是ALL,掃描了10行數(shù)據(jù),進行了全表掃描。<>也是同樣的結(jié)果。

2、類型不一致導致的索引失效

在說這個之前,一定要說一下設計表字段的時候,千萬、一定、必須要保持字段類型的一致性,啥意思?比如user表的id是int自增,到了用戶的賬戶表user_id這個字段,一定、必須也是int類型,千萬不要寫成varchar、char什么的騷操作。

  1. SELECT * FROM `user` WHERE height175

這個SQL諸位一定要看清楚,height表字段類型是varchar,但是我查詢的時候使用了數(shù)字類型,因為這個中間存在一個隱式的類型轉(zhuǎn)換,所以就會導致索引失效,進行全表掃描。

導致MySQL索引失效的幾種常見寫法

現(xiàn)在明白我為啥說設計字段的時候一定要保持類型的一致性了不,如果你不保證一致性,一個int一個varchar,在進行多表聯(lián)合查詢(eg: 1 = '1')必然走不了索引。

遇到這樣的表,里面有幾千萬數(shù)據(jù),改又不能改,那種痛可能你們暫時還體會。

少年們,切記,切記。

3、函數(shù)導致的索引失效

  1. SELECT * FROM `user` WHERE DATE(create_time) = '2020-09-03'; 

如果你的索引字段使用了索引,對不起,他是真的不走索引的。

導致MySQL索引失效的幾種常見寫法

4、運算符導致的索引失效

  1. SELECT * FROM `user` WHERE age - 1 = 20

如果你對列進行了(+,-,*,/,!), 那么都將不會走索引。

導致MySQL索引失效的幾種常見寫法

5、OR引起的索引失效

  1. SELECT * FROM `user` WHERE `name` = '張三' OR height = '175'

OR導致索引是在特定情況下的,并不是所有的OR都是使索引失效,如果OR連接的是同一個字段,那么索引不會失效,反之索引失效。

導致MySQL索引失效的幾種常見寫法

6、模糊搜索導致的索引失效

  1. SELECT * FROM `user` WHERE `name` LIKE '%冰'; 

這個我相信大家都明白,模糊搜索如果你前綴也進行模糊搜索,那么不會走索引。

導致MySQL索引失效的幾種常見寫法

7、NOT IN、NOT EXISTS導致索引失效

  1. SELECT s.* FROM `user` s WHERE NOT EXISTS (SELECT * FROM `user` u WHERE u.name = s.`name` AND u.`name` = '冰峰') 
  1. SELECT * FROM `user` WHERE `name` NOT IN ('冰峰'); 

這兩種用法,也將使索引失效。但是NOT IN 還是走索引的,千萬不要誤解為 IN 全部是不走索引的。我之前就有誤解(丟人了...)。

導致MySQL索引失效的幾種常見寫法

8、IS NULL不走索引,IS NOT NULL走索引

  1. SELECT * FROM `user` WHERE address IS NULL 

導致MySQL索引失效的幾種常見寫法

不走索引。

  1. SELECT * FROM `user` WHERE address IS NOT NULL; 

導致MySQL索引失效的幾種常見寫法

走索引。

根據(jù)這個情況,建議大家這設計字段的時候,如果沒有必要的要求必須為NULL,那么最好給個默認值空字符串,這可以解決很多后續(xù)的麻煩(有深刻的體驗<體驗=教訓>)。

符合索引

1、最左匹配原則

  1. EXPLAIN SELECT * FROM `user` WHERE sex = '男'
  1. EXPLAIN SELECT * FROM `user` WHERE name = '冰峰' AND sex = '男'

測試之前,刪除其他的單列索引。

啥叫最左匹配原則,就是對于符合索引來說,它的一個索引的順序是從左往右依次進行比較的,像第二個查詢語句,name走索引,接下來回去找age,結(jié)果條件中沒有age那么后面的sex也將不走索引。

導致MySQL索引失效的幾種常見寫法

注意:

  1. SELECT * FROM `user` WHERE sex = '男' AND age = 22 AND `name` = '冰峰'; 

可能有些搬磚工可能跟我最開始有個誤解,我們的索引順序明明是name、sex、age,你現(xiàn)在的查詢順序是sex、age、name,這肯定不走索引啊,你要是自己沒測試過,也有這種不成熟的想法,那跟我一樣還是太年輕了,它其實跟順序是沒有任何關(guān)系的,因為mysql的底層會幫我們做一個優(yōu)化,它會把你的SQL優(yōu)化為它認為一個效率最高的樣子進行執(zhí)行。所以千萬不要有這種誤解。

2、如果使用了!=會導致后面的索引全部失效

  1. SELECT * FROM `user` WHERE sex = '男' AND `name` != '冰峰' AND age = 22

我們在name字段使用了 != ,由于name字段是最左邊的一個字段,根據(jù)最左匹配原則,如果name不走索引,后面的字段也將不走索引。

導致MySQL索引失效的幾種常見寫法

關(guān)于符合索引導致索引失效的情況能說的目前就這兩種,其實我覺得對于符合索引來說,重要的是如何建立高效的索引,千萬不能說我用到那個字段我就去建立一個單獨的索引,不是就可以全局用了嘛。這樣是可以,但是這樣并沒有符合索引高效,所以為了成為高級的搬磚工,我們還是要繼續(xù)學習,如何創(chuàng)建高效的索引。

原文地址:https://mp.weixin.qq.com/s/VnjyjWKyhp2nPrqMJ7n9xw

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25
主站蜘蛛池模板: 91高清国产视频 | 天天操天天插天天干 | 黄污在线看| 久久久精品视频网站 | 久久国产精品久久久久久久久久 | 久久久www免费看片 亚洲综合视频一区 | 五月天堂av91久久久 | 国产合集91合集久久日 | 毛片在线视频在线播放 | 精品国产99久久久久久宅男i | 黄色特级片黄色特级片 | 成人视屏免费看 | 欧美xxxwww | 久久免费视频3 | 香蕉久久久久 | 伦理三区 | 高清国产一区二区三区四区五区 | 日韩在线播放第一页 | xxxx18韩国护士hd老师 | 久久不射电影网 | 男人的天堂色偷偷 | 在线免费黄色网 | 超久久 | 久久久综 | 免费99热在线观看 | 亚洲二区三区在线 | 一区二区三区在线观看视频 | 国产黄色录像片 | 亚洲福利在线视频 | 欧洲精品视频在线观看 | 特级西西444www大精品视频免费看 | 国产乱色精品成人免费视频 | 欧美人与禽性xxxxx杂性 | 黄色特级| 91美女福利视频 | 亚洲综合色视频在线观看 | 免费在线观看成年人视频 | 一级做a爰性色毛片免费 | 91精品国产日韩91久久久久久360 | 免费a级毛片永久免费 | 一道本不卡一区 |