MySQL 使用不到索引的情況

2021-06-28 10:49:16 字數 3561 閱讀 3259

mysql使用不到索引的情況有很多,今天具體操作了一番,總結了些常見的情況

建立以下表,有四個字段,其中name和password做了關聯索引,id為主鍵索引

mysql> show create table users \g

*************************** 1. row ***************************

table: users

create table: create table `users` (

`id` int(11) not null auto_increment,

`name` varchar(255) default null,

`password` varchar(255) default null,

`email` varchar(255) default null,

primary key (`id`),

key `loginindex` (`name`,`password`)

) engine=innodb auto_increment=6428544 default charset=utf8

1 row in set (0.00 sec)

1. 使用like關鍵字。like關鍵字使用有兩種情況

a) 有萬用字元且在關鍵字的最左邊,會使用不到索引,如下示例

b) 無萬用字元或者萬用字元不在關鍵字最左邊,能夠使用到索引,如'a%bc','abc%'

mysql>  explain select * from users where name like '%abc' \g

*************************** 1. row ***************************

id: 1

select_type: ******

table: users

type: all

possible_keys: null

key: null

key_len: null

ref: null

rows: 6257258

extra: using where

1 row in set (0.00 sec)

2. 聯合索引中,只有宣告在最左邊的字段被索引上了,在同時使用兩個列或使用最左邊的列作為查詢條件的時候會使用到索引

使用password欄位作為查詢條件未使用到索引

mysql> explain select * from users where password = '123' \g

*************************** 1. row ***************************

id: 1

select_type: ******

table: users

type: all

possible_keys: null

key: null

key_len: null

ref: null

rows: 6257258

extra: using where

1 row in set (0.00 sec)

3. 使用補集的情況 (!=,not in)

mysql> explain select * from users where name != 'aaa' \g

*************************** 1. row ***************************

id: 1

select_type: ******

table: users

type: all

possible_keys: loginindex

key: null

key_len: null

ref: null

rows: 6257258

extra: using where

1 row in set (0.04 sec)

mysql> explain select * from users where name not in ('aaa', 'bbb', 'ccc') \g

*************************** 1. row ***************************

id: 1

select_type: ******

table: users

type: all

possible_keys: loginindex

key: null

key_len: null

ref: null

rows: 6257258

extra: using where

1 row in set (0.04 sec)

4. 使用了錯誤的資料型別

範例如下,name欄位使用了varchar型別儲存,雖然不加引號當做int型別時候可以解析,但是不會用到索引

mysql> explain select * from users where name = 123456 \g

*************************** 1. row ***************************

id: 1

select_type: ******

table: users

type: all

possible_keys: loginindex

key: null

key_len: null

ref: null

rows: 6257258

extra: using where

1 row in set (0.00 sec)

5.在未新增索引字段使用or關鍵字

mysql> explain select * from users where name = 'a' or password = 'b' \g

*************************** 1. row ***************************

id: 1

select_type: ******

table: users

type: all

possible_keys: loginindex

key: null

key_len: null

ref: null

rows: 6257258

extra: using where

1 row in set (0.00 sec)

刪除你用不到的核心

每當ubuntu中的linux核心公升級為新版本時,它都會將舊版本給留下來,然後你機器上的grub選單就會越來越長,這樣做無非是在當你使用新核心出現問題時為你提供乙個保障,而大多數情況下,當你使用新核心一切正常,那些老版本的核心你也許根本就不會再用了。本文將指導你如何安全的刪除那些廢棄不用的舊核心。...

如何刪除你用不到的核心

使用ubuntu一段時間後,就會發覺由於自動公升級,系統裡安裝了很多核心。這個造成了漫長的啟動列表,必須刪掉 一些不用的。首先你需要找出現在用的核心是什麼版本。開啟終端,使用下面這個命令 uname r 你就會得到當前使用的linux核心版本。這個版本必須留著不能刪除。它的格式大概是這樣的 2.6....

工作中用不到的技術要不要學?

有同學說,現在的工作中用不到openstack雲計算技術,那要不要學?我覺得運維班有乙個同學有個這方面的 名言 話,很經典!如果大多數公司都用openstack雲計算了,你在學這個可能就不值錢了。正因為用的公司不是很多,學完了才值錢,現在學完了,可以再公司裡給公司上,或者去需要的公司上,這樣價值就體...