提高查询整体性能

时间:2018-04-15 04:39:40

标签: mysql database join indexing

我正努力提高查询的整体性能,因为在编写查询或通过索引优化查询时,我不是专业人士。无论哪种方式,请考虑我的SQL小提琴here以获得精确的样本。我正在寻找一种方法(如果有的话)在执行查询时使用索引以便更快地执行(截至目前的数据很小,但它最终会增长,查询将运行缓慢 - 这就是我所担心的)。

以下是我当前的EXPLAIN结果: enter image description here

下面的更多信息,其中包含整个架构和查询:

DROP TABLE IF EXISTS `battery_batch`;
CREATE TABLE `battery_batch`  (
  `bb_id` int(11) NOT NULL AUTO_INCREMENT,
  `cc_id` int(11) NOT NULL,
  `batch_num` int(11) NOT NULL,
  `date_encoded` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `encoded_by_id` int(11) NOT NULL,
  PRIMARY KEY (`bb_id`) USING BTREE,
  INDEX `batch_num`(`batch_num`) USING BTREE,
  INDEX `cc_id`(`cc_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

INSERT INTO `battery_batch` VALUES (1, 5, 1, '2018-04-12 09:35:37', 1);

DROP TABLE IF EXISTS `battery_inbound_shipment`;
CREATE TABLE `battery_inbound_shipment`  (
  `bis_id` int(11) NOT NULL AUTO_INCREMENT,
  `bb_id` int(11) NOT NULL,
  `bpn_id` int(11) NOT NULL,
  `order_num` varchar(25) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `shipment_id` varchar(25) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `encoded_by_id` int(11) NOT NULL,
  `date_encoded` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`bis_id`) USING BTREE,
  INDEX `bb_id`(`bb_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

INSERT INTO `battery_inbound_shipment` VALUES (1, 1, 1, 'RTS1', 'SID1', 1, '2018-04-14 18:48:48');
INSERT INTO `battery_inbound_shipment` VALUES (2, 1, 2, 'RTS1', 'SID1', 1, '2018-04-14 18:48:50');
INSERT INTO `battery_inbound_shipment` VALUES (3, 1, 3, 'RTS2', 'SID1', 1, '2018-04-14 18:48:53');

DROP TABLE IF EXISTS `battery_part_num`;
CREATE TABLE `battery_part_num`  (
  `bpn_id` int(11) NOT NULL AUTO_INCREMENT,
  `mb_id` int(11) NOT NULL,
  `part_num` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `part_desc` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `encoded_by_id` int(11) NOT NULL,
  `date_encoded` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`bpn_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

INSERT INTO `battery_part_num` VALUES (1, 71, '6424B', 'NEW PRODUCT', 1, '2018-04-14 18:48:48');
INSERT INTO `battery_part_num` VALUES (2, 51, '6422B', 'NEW PRODUCT', 1, '2018-04-14 18:48:50');
INSERT INTO `battery_part_num` VALUES (3, 71, '6423B', 'NEW PRODUCT', 1, '2018-04-14 18:48:52');

DROP TABLE IF EXISTS `battery_record`;
CREATE TABLE `battery_record`  (
  `br_id` int(11) NOT NULL AUTO_INCREMENT,
  `bis_id` int(11) NOT NULL,
  `battery_serial` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `date_encoded` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `encoded_by_id` int(11) NOT NULL,
  `battery_origin` enum('A Battery','B Battery') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'A Battery',
  `void_record_id` int(11) NOT NULL DEFAULT 0,
  PRIMARY KEY (`br_id`) USING BTREE,
  INDEX `battery_serial`(`battery_serial`) USING BTREE,
  INDEX `battery_serial_search`(`battery_serial`, `void_record_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 64522 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

INSERT INTO `battery_record` VALUES (2, 1, 'ABC74661V8J1234CV', '2018-04-14 18:48:48', 1, 'A Battery', 367113);
INSERT INTO `battery_record` VALUES (4, 1, 'ABC747307ER1234CV', '2018-04-14 18:48:48', 1, 'A Battery', 367113);
INSERT INTO `battery_record` VALUES (6, 1, 'ABC802714SQ1234C6', '2018-04-14 18:48:48', 1, 'A Battery', 367113);
INSERT INTO `battery_record` VALUES (8, 1, 'ABC802714SS1234C4', '2018-04-14 18:48:48', 1, 'A Battery', 367113);
INSERT INTO `battery_record` VALUES (10, 1, 'ABC80270F6H1234CX', '2018-04-14 18:48:48', 1, 'A Battery', 367113);
INSERT INTO `battery_record` VALUES (11, 1, 'ABC802714SU1234C2', '2018-04-14 18:48:48', 1, 'A Battery', 367113);
INSERT INTO `battery_record` VALUES (12, 1, 'ABC802714SN1234C8', '2018-04-14 18:48:48', 1, 'A Battery', 367113);
INSERT INTO `battery_record` VALUES (13, 1, 'ABC80270PPM1234C2', '2018-04-14 18:48:48', 1, 'A Battery', 367113);
INSERT INTO `battery_record` VALUES (14, 1, 'ABC80270PPH1234C6', '2018-04-14 18:48:48', 1, 'A Battery', 367113);
INSERT INTO `battery_record` VALUES (15, 1, 'ABC80270QZT1234CZ', '2018-04-14 18:48:48', 1, 'A Battery', 367113);
INSERT INTO `battery_record` VALUES (16, 1, 'ABC80270V191234C6', '2018-04-14 18:48:48', 1, 'A Battery', 367113);
INSERT INTO `battery_record` VALUES (17, 1, 'ABC80270V1M1234CU', '2018-04-14 18:48:48', 1, 'A Battery', 367113);
INSERT INTO `battery_record` VALUES (18, 1, 'ABC80270EN71234CU', '2018-04-14 18:48:48', 1, 'A Battery', 367113);
INSERT INTO `battery_record` VALUES (19, 1, 'ABC80270V1D1234C2', '2018-04-14 18:48:48', 1, 'A Battery', 367113);
INSERT INTO `battery_record` VALUES (20, 1, 'ABC80270F3J1234C5', '2018-04-14 18:48:48', 1, 'A Battery', 367113);

DROP TABLE IF EXISTS `battery_verified_record`;
CREATE TABLE `battery_verified_record`  (
  `bvr_id` int(11) NOT NULL AUTO_INCREMENT,
  `br_id` int(11) NOT NULL,
  `u_id` int(11) NOT NULL,
  `scan_date` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`bvr_id`) USING BTREE,
  INDEX `br_id`(`br_id`) USING BTREE,
  UNIQUE INDEX `scan_date`(`scan_date`, `br_id`) USING BTREE,
  INDEX `u_id`(`u_id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

INSERT INTO `battery_verified_record` VALUES (1, 2, 1, '2018-04-15 11:20:09');
INSERT INTO `battery_verified_record` VALUES (2, 4, 1, '2018-04-15 11:54:00');
INSERT INTO `battery_verified_record` VALUES (3, 6, 1, '2018-04-15 12:23:55');
INSERT INTO `battery_verified_record` VALUES (4, 8, 1, '2018-04-15 12:23:57');
INSERT INTO `battery_verified_record` VALUES (5, 10, 1, '2018-04-15 12:23:58');

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `Username` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  `Password` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  `PasswordExpirationDate` datetime(6) NOT NULL,
  `FirstName` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  `LastName` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL,
  `LocationId` int(11) NOT NULL,
  `IsActive` tinyint(1) NOT NULL,
  `IsDeleted` tinyint(1) NOT NULL,
  `UserTypeId` int(11) NOT NULL,
  `VendorId` int(11) NULL DEFAULT NULL,
  `ResetPassword` tinyint(1) NOT NULL DEFAULT 0,
  `Workerid` varchar(45) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `ComputerProcessMappingId` int(11) NOT NULL,
  PRIMARY KEY (`Id`) USING BTREE,
  INDEX `LastName`(`LastName`, `FirstName`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 489 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

INSERT INTO `user` VALUES (1, 'superadmin', '1000:Q8v+4nGsGUGvmvlCkhdWI0Sf+ABCDEFG+YY:vHkHPWNrvLyX5pUm8Q4HrmJlTkZhpvZL', '2017-02-07 09:41:04.000000', 'Super', 'Admin', 4, 1, 0, 1, NULL, 0, '1', 0);

DROP TABLE IF EXISTS `customer_client`;
CREATE TABLE `customer_client`  (
  `cc_id` int(11) NOT NULL AUTO_INCREMENT,
  `client_code` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
  `client_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'NOT AVAILABLE',
  `date_encoded` datetime(0) NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`cc_id`) USING BTREE,
  UNIQUE INDEX `tmp_1`(`client_code`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 85 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

INSERT INTO `customer_client` VALUES (5, 'MNO - 05', 'NOT AVAILABLE', '2018-03-26 14:28:22');





####


SELECT
    br.battery_serial 'BatterySerial',
    cc.client_code 'Client',
    bb.batch_num 'Batch',
    CONCAT(u.LastName, ', ', u.FirstName) 'VerifiedBy',
    bvr.scan_date 'ScanDate'
FROM
    battery_verified_record bvr
JOIN
    battery_record br
ON
    br.br_id = bvr.br_id
JOIN
    battery_inbound_shipment bis
ON
    bis.bis_id = br.bis_id
JOIN
    battery_batch bb
ON
    bb.bb_id = bis.bb_id
JOIN
    customer_client cc
ON
    cc.cc_id = bb.cc_id
JOIN
    user u
ON
    u.Id = bvr.u_id
WHERE
    bvr.scan_date BETWEEN CONCAT(DATE_FORMAT(NOW(), '%Y-%m-%d'), ' 00:00:00') AND NOW()
ORDER BY
    bvr.scan_date DESC;

1 个答案:

答案 0 :(得分:1)

您错过了加入条件的索引:

 bb.cc_id
 bvr.u_id