【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%'
2. 聯合索引中,只有宣告在最左邊的欄位被索引上了,在同時使用兩個列或使用最左邊的列作為查詢條件的時候會使用到索引 使用password欄位作為查詢條件未使用到索引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)
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 *******************
【mybatis】mybatis中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.如果列型別是字串,那一定要在條件
【mysql】service 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
【MySQL】MySQL的索引
約束 記錄 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
【mysql】mysql索引探索(三)-- 高效能使用索引的策略
既然我們已經對索引的本質有所瞭解,那麼我們就應該來討論如何高效能的使用引擎。 1. 列的離散性越高,選擇性越好。 列的離散性是這樣定義的:count(discount col):count(col),也就是不同的列數比列的總數。這個數值越大說明列的離散型就越好。 如果用
3.【MYSQL】索引
MYSQL索引 Mysql索引四種索引 Mysql查詢索引的方式 索引的代價 複合索引左字首規則 執行計劃 索引使用的情況查詢 Mysql索引四種索引 主鍵索
【MySQL】mysql面試相關問題(正規化,事物,檢視,索引)
三大正規化: 1、單個欄位不能繼續拆分,(個人理解:列具有原子性) 2、在第一正規化的基礎上,每個表只描述一件事情。可以理解為第二正規化就是要有主鍵,要求其他欄位都依賴於主鍵。 為什麼要有主鍵——沒有主鍵就沒有唯一性,沒有唯一性在集合中就定位不到這行記錄,所以要有主鍵。 其他欄位為什
【MySQL】效能優化之 覆蓋索引
mysql中的一種十分高效有用的索引---覆蓋索引。 覆蓋索引用通俗的話講就是在select的時候只用去讀取索引而取得資料,無需進行二次select相關表。這樣的索引的葉子節點上面也包含了他們索引的資料。 select * from table_name; select id,name from table_
【MySQL】索引
索引型別 B -Tree 索引 概念 B-Tree意味著所有的值都是按順序儲存的,並且每一個葉子頁到根的距離相同,B-Tree從索引的根節點開始搜尋,根節點槽中存放了指向子節點的指標,通過比較節點頁的值和要查詢的值可以找到合適的指標進入下層子節點 B-Tree
【MySQL】MySQL儲存引擎以及索引
一、儲存引擎 MySQL中的資料用各種不同的技術儲存在檔案中,這些技術中的每一種技術都使用不同的儲存機制、索引技巧、鎖定水平並且最終提供廣泛的不同的功能和能力。這些不同的技術以及配套的相關功能在 MySQL中被稱作儲存引擎(也稱作表型別)。 我的理解是,資料
【MYSQL】查詢不區分大小寫
MYSQL在預設的情況下查詢是不區分大小寫的,例如:mysql> create table t1( -> name varchar(10)); Query OK, 0 rows affected (0.09 sec)mysql> insert into
【MySQL】-索引
什麼是索引? 排好序的快速查詢資料結構 目的: 提高查詢效率 在資料之外,資料庫系統還維護著滿足特定查詢演算法的資料結構,這些資料結枘以某種方式引用(指向)資料, 這樣就可以在這些資料結構上實
【mysql】Linux下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