先上兩張表在ddl陳述句(資料庫為MySQL):
CREATE TABLE `goods_order` (
`GOODS_ORDER_ID` int(12) NOT NULL AUTO_INCREMENT COMMENT '物料訂單ID',
`GOODS_ORDER_NO` varchar(50) DEFAULT NULL COMMENT '訂單流水號訂單型別+組織機構+系統ID+序列',
`SOU_ORGAN_ID` int(12) DEFAULT NULL COMMENT '訂單來源組織機構',
`SOU_SYS` int(2) DEFAULT NULL COMMENT '訂單來源系統',
`OPR_USER_ID` int(12) DEFAULT NULL COMMENT '訂單下單人',
`SERVICE` int(2) DEFAULT NULL COMMENT '訂單型別',
`CRT_TIME` datetime DEFAULT NULL COMMENT '下單時間',
`STATUS` varchar(4) DEFAULT NULL COMMENT '訂單狀態',
`GOODS_ORDER_DESC` varchar(500) DEFAULT NULL COMMENT '訂單備注',
`REL_ORDER_ID` varchar(50) DEFAULT NULL COMMENT '關聯外部訂單ID',
`STORE_IDS` varchar(100) DEFAULT NULL COMMENT '涉及倉庫ID',
`IN_STORE_ID` int(12) DEFAULT NULL COMMENT '入庫倉庫ID',
`OUT_STORE_ID` int(12) DEFAULT NULL COMMENT '出庫倉庫ID',
`order_id` bigint(20) DEFAULT NULL COMMENT '涉及訂單1',
`flow_inst_id` int(11) DEFAULT NULL,
PRIMARY KEY (`GOODS_ORDER_ID`)
) ENGINE=InnoDB AUTO_INCREMENT=3955 DEFAULT CHARSET=utf8;
CREATE TABLE `goods_order_item` (
`GOODS_ORDER_ITEM_ID` int(12) NOT NULL AUTO_INCREMENT COMMENT '訂單明細ID',
`GOODS_ORDER_ID` int(12) DEFAULT NULL COMMENT '訂單ID',
`SERVICE` int(2) DEFAULT NULL COMMENT '訂單型別',
`EQUIPMENT_INST_ID` int(12) DEFAULT NULL COMMENT '物料實體ID',
`PRE_COUNT` float(12,2) DEFAULT NULL,
`REL_COUNT` float(12,2) DEFAULT NULL,
`PRICE` float(12,2) DEFAULT NULL COMMENT '物料單價',
`SUPPLIER_ID` int(12) DEFAULT NULL COMMENT '物料供應商',
`TAR_POSITION_ID` int(12) DEFAULT NULL COMMENT '物料歸屬位置',
`TAR_SG_REL_ID` int(12) DEFAULT NULL COMMENT '物料歸屬明細',
`SOU_SG_REL_ID` int(12) DEFAULT NULL COMMENT '物料來源明細',
`USE_USER_ID` int(12) DEFAULT NULL COMMENT '物料領用人',
`RET_USER_ID` int(12) DEFAULT NULL COMMENT '物料歸還人',
`EQUIPMENT_AREA_ID` int(12) DEFAULT NULL COMMENT '設備啟用位置',
`EQUIPMENT_POSITION` varchar(100) DEFAULT NULL COMMENT '設備啟用位置詳細',
`EQUIPMENT_AREA_POINT_ID` int(12) DEFAULT NULL COMMENT '啟用位置熱點',
`HOUSE_ID` int(12) DEFAULT NULL COMMENT '啟用房間號(針對于水電煤氣儀表類設備)',
`PRE_COUNT2` int(12) DEFAULT NULL COMMENT '新設備預計數量(設備更換使用)',
`REL_COUNT2` int(12) DEFAULT NULL COMMENT '新設備實際數量(設備更換使用)',
`TAR_OPR` int(12) DEFAULT NULL COMMENT '設備清理去處',
`CRT_TIME` datetime DEFAULT NULL COMMENT '下單時間',
`GO_ITEM_DESC` varchar(50) DEFAULT NULL COMMENT '備注',
`initial_price` varchar(10) DEFAULT NULL COMMENT '銷售價格',
`deliver_price` varchar(10) DEFAULT NULL COMMENT '標準價格',
`users` varchar(300) DEFAULT NULL,
`SELL_PRICE` varchar(10) DEFAULT '0' COMMENT '銷售價格',
PRIMARY KEY (`GOODS_ORDER_ITEM_ID`),
KEY `goods_order_item_index` (`SOU_SG_REL_ID`),
) ENGINE=InnoDB AUTO_INCREMENT=7108 DEFAULT CHARSET=utf8;
1、首先來看一下現在的sql
SELECT * FROM GOODS_ORDER H , GOODS_ORDER_ITEM G
WHERE G.GOODS_ORDER_ID=H.GOODS_ORDER_ID;
執行計劃如下

執行時間 0.2S
2、alter TABLE goods_order_item add INDEX goods_order_id_index(goods_order_id)
加了一個索引,執行計劃變為如下:

執行時間為0.4S
我的疑問出來了,為什么加了索引而且rows也明顯變少,執行次數應該更少啊,為何執行時間卻增加了很多,求大神幫忙解答
uj5u.com熱心網友回復:
因為主表沒用上索引,子表倒是可以用上索引了。uj5u.com熱心網友回復:
另外,如果是select * 這種查詢,索引的作用不是那么大,唯一的作用就是關聯方便,還不如全表掃描。索引只有在查詢少量資料的時候,才能發揮奇效
uj5u.com熱心網友回復:
點錯了,該點成對我有用 ,卻點成了丟了板磚,但是有點疑問,子表用上索引 查詢就該慢嗎
uj5u.com熱心網友回復:
這個倒是不一定的。
除了索引外,還有一個影響的因素,就是以那個為主來關聯,這個也會影響性能,一般應該以記錄數少的為主,來關聯記錄數大的。
你的主表有多少條,子表有多少條,連接之后有多少條?
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/113817.html
標籤:MySQL
