日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

mysql连接字段需要索引_mysql – 索引字段上的连接不使用索引

發(fā)布時間:2024/1/18 数据库 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql连接字段需要索引_mysql – 索引字段上的连接不使用索引 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

我有兩張桌子.我寫了一個查詢來在一列上加入它們.此列在兩個表中都已編制索引,但MySQL未使用索引.有人a)告訴我為什么和b)告訴我如何讓MySQL使用索引快速加入這些表.

第一張表:

CREATE TABLE `dol_msa_zip_assoc` (

`pkey` int(5) unsigned NOT NULL AUTO_INCREMENT,

`zip` varchar(5) NOT NULL DEFAULT '',

`pmsa_msa` varchar(5) NOT NULL DEFAULT '',

PRIMARY KEY (`pkey`),

KEY `zip` (`zip`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

它包含42690條記錄.

另一張桌子:

CREATE TABLE `v3_msa_zip_assoc` (

`pkey` int(5) unsigned NOT NULL AUTO_INCREMENT,

`zip` varchar(9) NOT NULL DEFAULT '',

`pmsa_msa` varchar(6) NOT NULL DEFAULT '',

PRIMARY KEY (`pkey`),

KEY `zip` (`zip`)

) ENGINE=MyISAM DEFAULT CHARSET=latin1;

它包含42486條記錄.

我的查詢,旨在查找第一個表中不在第二個表中的記錄:

SELECT d.*, o.* FROM `dol_msa_zip_assoc` d

LEFT JOIN `v3_msa_zip_assoc` o

ON o.zip = d.zip

WHERE o.zip IS NULL

當(dāng)我解釋此查詢時,我看到zip列上的索引未被使用:

+----+-------------+-------+------+---------------+------+---------+------+-------+----------------------------------------------------------------+

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

+----+-------------+-------+------+---------------+------+---------+------+-------+----------------------------------------------------------------+

| 1 | SIMPLE | d | ALL | NULL | NULL | NULL | NULL | 42915 | NULL |

| 1 | SIMPLE | o | ALL | NULL | NULL | NULL | NULL | 42486 | Using where; Not exists; Using join buffer (Block Nested Loop) |

+----+-------------+-------+------+---------------+------+---------+------+-------+----------------------------------------------------------------+

導(dǎo)致此失敗的原因可能是什么?是因?yàn)橐粋€zip列是latin1而另一個是utf8?如何使用此查詢來使用索引,以便它不需要運(yùn)行年齡?

編輯:反轉(zhuǎn)JOIN的順序顯然確實(shí)利用了索引:

SELECT d . * , o . *

FROM `v3_msa_zip_assoc` o

LEFT JOIN `dol_msa_zip_assoc` d ON d.zip = o.zip

WHERE d.zip IS NULL

這是解釋:

+----+-------------+-------+------+---------------+------+---------+------+-------+-------------------------+

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

+----+-------------+-------+------+---------------+------+---------+------+-------+-------------------------+

| 1 | SIMPLE | o | ALL | NULL | NULL | NULL | NULL | 42486 | NULL |

| 1 | SIMPLE | d | ref | zip | zip | 17 | func | 1 | Using where; Not exists |

+----+-------------+-------+------+---------------+------+---------+------+-------+-------------------------+

編輯2:我已經(jīng)改變舊表的結(jié)構(gòu)以使用utf8排序規(guī)則.現(xiàn)在定義如下:

CREATE TABLE `v3_msa_zip_assoc` (

`pkey` int(5) unsigned NOT NULL AUTO_INCREMENT,

`zip` varchar(9) NOT NULL DEFAULT '',

`pmsa_msa` varchar(6) NOT NULL DEFAULT '',

PRIMARY KEY (`pkey`),

KEY `zip` (`zip`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

這似乎解決了這個問題:

mysql> EXPLAIN SELECT d . * , o . *

-> FROM `dol_msa_zip_assoc` d

-> LEFT JOIN `v3_msa_zip_assoc` o ON o.zip = d.zip

-> WHERE o.zip IS NULL;

+----+-------------+-------+------+---------------+------+---------+---------------------+-------+-------------------------+

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

+----+-------------+-------+------+---------------+------+---------+---------------------+-------+-------------------------+

| 1 | SIMPLE | d | ALL | NULL | NULL | NULL | NULL | 42915 | NULL |

| 1 | SIMPLE | o | ref | zip | zip | 29 | myplan_v4_dev.d.zip | 1 | Using where; Not exists |

+----+-------------+-------+------+---------------+------+---------+---------------------+-------+-------------------------+

總結(jié)

以上是生活随笔為你收集整理的mysql连接字段需要索引_mysql – 索引字段上的连接不使用索引的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。