1. 程式人生 > >【MySQL】使用不到索引的情況

【MySQL】使用不到索引的情況

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: SIMPLE
        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: SIMPLE
        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: SIMPLE
        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: SIMPLE
        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: SIMPLE
        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: SIMPLE
        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)


相關推薦

MySQL使用索引情況

MySQL使用不到索引的情況有很多,今天具體操作了一番,總結了些常見的情況 建立以下表,有四個欄位,其中name和password做了關聯索引,id為主鍵索引 mysql> show create table users \G *******************

mybatismybatis中insert 主鍵自增和自增的插入情況mysql

pro SQ class TE IV rop generate mys bat 主鍵不自增:返回值是插入的條數 <insert id="add" parameterType="EStudent"> insert into TStudent(name,

mysql哪些情況mysql索引會失效?

如果條件中有or,即使其中有條件帶索引也不會使用(這也是為什麼儘量少用or的原因)      注意:要想使用or,又想讓索引生效,只能將or條件中的每個列都加上索引   2.對於多列索引,不是使用的第一部分,則不會使用索引   3.like查詢是以%開頭   4.如果列型別是字串,那一定要在條件

mysqlservice mysql start出錯,mysql啟動了,解決mysql: unrecognized service錯誤

開機 init.d starting 設置 tin 執行 rest root lan service MySQL start出錯,mysql啟動不了,解決mysql: unrecognized service錯誤的方法如下: [[email protected]/

MySQL如何解決MySQL中查詢區分大小寫的問題

bsp title 標識 article ble 問題 col bold table mysql查詢默認是不區分大小寫的 如: select * from some_table where str=‘abc‘; select * from some_ta

MySQLMySQL索引

約束 記錄 col 因此 訪問 除了 color 要求 rst 索引是存放在模式中的一個數據庫對象,雖然索引總是從屬於數據表,但它也和數據表一樣屬於數據庫對象。創建索引的唯一作用就是加速對表的查詢,索引通過使用快速路徑訪問方法來快速定位數據,從而減少了磁盤的I/O。 My

Mysql細節補充,約束、索引

約束: 顯示建表語句:show create table 表名 查詢表中的約束:SELECT * FROM information_schema.`TABLE_CONSTRAINTS`  where table_name = '表名' 新增約束:alter table 表名 a

mysql獲取mysql重複的資料

假設情景如下: user_table的欄位如下: keyword \t c_time \t heat keyword是字串的具有重複性的,c_time表示的是時間,heat是整形常數。 如下所示: 程式碼如下: select keyword, max(created

mysqlmysql索引探索(三)-- 高效能使用索引的策略

既然我們已經對索引的本質有所瞭解,那麼我們就應該來討論如何高效能的使用引擎。 1. 列的離散性越高,選擇性越好。 列的離散性是這樣定義的:count(discount col):count(col),也就是不同的列數比列的總數。這個數值越大說明列的離散型就越好。 如果用

3.MYSQL索引

MYSQL索引 Mysql索引四種索引 Mysql查詢索引的方式 索引的代價 複合索引左字首規則 執行計劃 索引使用的情況查詢 Mysql索引四種索引 主鍵索

MySQLmysql面試相關問題(正規化,事物,檢視,索引

三大正規化: 1、單個欄位不能繼續拆分,(個人理解:列具有原子性) 2、在第一正規化的基礎上,每個表只描述一件事情。可以理解為第二正規化就是要有主鍵,要求其他欄位都依賴於主鍵。 為什麼要有主鍵——沒有主鍵就沒有唯一性,沒有唯一性在集合中就定位不到這行記錄,所以要有主鍵。 其他欄位為什

MySQL效能優化之 覆蓋索引

mysql中的一種十分高效有用的索引---覆蓋索引。 覆蓋索引用通俗的話講就是在select的時候只用去讀取索引而取得資料,無需進行二次select相關表。這樣的索引的葉子節點上面也包含了他們索引的資料。 select * from table_name; select id,name from table_

MySQL索引

索引型別 B -Tree 索引 概念 B-Tree意味著所有的值都是按順序儲存的,並且每一個葉子頁到根的距離相同,B-Tree從索引的根節點開始搜尋,根節點槽中存放了指向子節點的指標,通過比較節點頁的值和要查詢的值可以找到合適的指標進入下層子節點 B-Tree

MySQLMySQL儲存引擎以及索引

一、儲存引擎 MySQL中的資料用各種不同的技術儲存在檔案中,這些技術中的每一種技術都使用不同的儲存機制、索引技巧、鎖定水平並且最終提供廣泛的不同的功能和能力。這些不同的技術以及配套的相關功能在 MySQL中被稱作儲存引擎(也稱作表型別)。 我的理解是,資料

MYSQL查詢區分大小寫

MYSQL在預設的情況下查詢是不區分大小寫的,例如:mysql> create table t1(    -> name varchar(10)); Query OK, 0 rows affected (0.09 sec)mysql> insert into

MySQL-索引

什麼是索引? 排好序的快速查詢資料結構 目的: 提高查詢效率 在資料之外,資料庫系統還維護著滿足特定查詢演算法的資料結構,這些資料結枘以某種方式引用(指向)資料, 這樣就可以在這些資料結構上實

mysqlLinux下mysql資料庫顯示全解決全過程

症狀:在mysql下,show databases,僅顯示兩個資料庫,而非全部的資料庫mysql>show databases;  +--------------------+  |Databas

MySQL資料型別&時間戳&主鍵&外來鍵&索引

一、資料表的建立 示例: 二、MySQL資料型別 1. 整數型別:BIT、BOOL、TINYINT、SMALLINT、MEDIUMINT、 INT、 BIGINT MySQL資料型別

Mysql索引簡介

本文口味:番茄炒蛋,預計閱讀:10分鐘。 部落格又停更了兩個月,在這期間,對人生和世界多了許多思考。在人生的不同階段,會對生活和世界有著不一樣的認知,而認知的改變也會直接反應在行為模式之中。 對於生活的思考心得也會在之後的時間裡,慢慢分享給大家,一方面是對自己心路歷程的記錄和總結,另一方面也希望能給遇到同樣問

Mysql常用命令

flush mysq tmp pri nec 清除 int 用戶 創建 登錄mysql -uroot -p 查看有哪些數據庫show databases; 創建一個普通用戶 sa ,密碼是 some_passCREATE USER [email protecte