查询Mysql存储过程的优化

时间:2017-09-12 12:26:54

标签: php mysql stored-procedures query-optimization

我正在 RDBMS(MYSQL)工作,我们有大约 15到20 表格,超过 4的主要表格缺少行数70每个表中的列。在检索数据的大部分时间我必须使用左连接,这会导致延迟操作。我们使用存储过程,建议任何最佳的快速操作方法。

CREATE TABLE `patient_data` (
    `p_id` INT(11) NOT NULL AUTO_INCREMENT,
    `entry_date` DATETIME NOT NULL COMMENT 'Registration Date',
    `hr_id` INT(11) NOT NULL,
    `ua_id` INT(11) NOT NULL,
    `mrn1` VARCHAR(20) NOT NULL COMMENT 'mrn initial',
    `mrn2` INT(20) NOT NULL DEFAULT '0' COMMENT 'mrn counter',
    `title` VARBINARY(50) NULL DEFAULT NULL,
    `fname` VARBINARY(50) NOT NULL,
    `lname` VARBINARY(50) NOT NULL,
    `mname` VARBINARY(50) NULL DEFAULT NULL,
    `suffix` VARBINARY(50) NULL DEFAULT NULL,
    `dob` VARBINARY(50) NOT NULL,
    `pat_photo` VARBINARY(50) NULL DEFAULT NULL,
    `blood_group` VARBINARY(50) NULL DEFAULT NULL,
    `street` VARBINARY(255) NULL DEFAULT NULL,
    `postal_code` VARBINARY(50) NULL DEFAULT NULL,
    `city` VARBINARY(50) NULL DEFAULT NULL,
    `state` VARBINARY(50) NULL DEFAULT NULL,
    `country` VARBINARY(50) NULL DEFAULT NULL,
    `drivers_license` VARBINARY(50) NULL DEFAULT NULL,
    `ss` VARBINARY(20) NULL DEFAULT NULL COMMENT 'adhar no',
    `occupation` VARBINARY(50) NULL DEFAULT NULL,
    `home_phone` VARBINARY(50) NULL DEFAULT NULL,
    `work_phone` VARBINARY(50) NULL DEFAULT NULL,
    `mobile_no` VARBINARY(50) NULL DEFAULT NULL,
    `emergency_no` VARBINARY(50) NULL DEFAULT NULL,
    `m_status` VARBINARY(50) NULL DEFAULT NULL,
    `emergency_contact` VARBINARY(50) NULL DEFAULT NULL,
    `sex` VARBINARY(50) NOT NULL,
    `email` VARBINARY(50) NULL DEFAULT NULL,
    `alternate_email` VARBINARY(50) NULL DEFAULT NULL,
    `race` VARBINARY(50) NULL DEFAULT NULL,
    `financial` VARBINARY(50) NULL DEFAULT NULL,
    `ethnicity` VARBINARY(50) NULL DEFAULT NULL,
    `interpreter` VARBINARY(50) NULL DEFAULT NULL,
    `migrantseasonal` VARBINARY(50) NULL DEFAULT NULL,
    `family_size` VARBINARY(50) NULL DEFAULT NULL,
    `monthly_income` VARBINARY(50) NULL DEFAULT NULL,
    `homeless` VARBINARY(50) NULL DEFAULT NULL,
    `financial_review` VARBINARY(50) NULL DEFAULT NULL,
    `referral_source` VARBINARY(30) NULL DEFAULT NULL,
    `vfc` VARBINARY(50) NULL DEFAULT NULL,
    `admit_flag` INT(2) NOT NULL DEFAULT '0' COMMENT '0-Not Admit,1-admitted',
    `select_reason` VARCHAR(20) NULL DEFAULT NULL,
    `delete_reason` VARCHAR(150) NULL DEFAULT NULL,
    `relation_with_patient` VARBINARY(50) NULL DEFAULT NULL,
    `relative_name` VARBINARY(100) NULL DEFAULT NULL,
    `referred_by` VARBINARY(50) NULL DEFAULT NULL,
    `referred_no` VARBINARY(20) NULL DEFAULT NULL,
    `flag` VARCHAR(2) NOT NULL DEFAULT 'c',
    `update_date` DATETIME NULL DEFAULT NULL COMMENT 'Last Updation of Date',
    `update_ua_id` INT(11) NOT NULL DEFAULT '0',
    `tpa` VARCHAR(50) NULL DEFAULT NULL,
    `age` VARBINARY(50) NULL DEFAULT NULL,
    `opd_no` VARBINARY(50) NULL DEFAULT NULL,
    `duplicate_flag` VARBINARY(50) NULL DEFAULT NULL,
    `department` VARBINARY(50) NULL DEFAULT NULL,
    `patient_type` VARBINARY(50) NULL DEFAULT NULL,
    `revisit` INT(2) NULL DEFAULT '0',
    `simul_flag` INT(2) NULL DEFAULT '0' COMMENT '1= duplicate(simulation)',
    `tags` VARCHAR(50) NULL DEFAULT NULL,
    `balance_amount` FLOAT NULL DEFAULT NULL,
    `opd_visit_counter` INT(50) NULL DEFAULT NULL,
    `patient_camera_pic` VARCHAR(255) NULL DEFAULT NULL,
    `baby_birth_time` VARBINARY(50) NULL DEFAULT NULL,
    `location` VARBINARY(50) NULL DEFAULT NULL,
    `aadhaar_no` VARBINARY(50) NULL DEFAULT NULL,
    `old_uhid` VARCHAR(50) NULL DEFAULT NULL,
    `er_id` INT(11) NULL DEFAULT NULL COMMENT 'For current er id',
    `patient_pancardno` VARBINARY(50) NULL DEFAULT NULL,
    `district` VARBINARY(50) NULL DEFAULT NULL,
    `religion` VARBINARY(50) NULL DEFAULT NULL,
    `vulnerable_type` INT(11) NULL DEFAULT '0',
    `vulnerable_data` VARCHAR(255) NULL DEFAULT NULL,
    `weight` FLOAT NULL DEFAULT NULL,
    `insurance_type` INT(11) NULL DEFAULT NULL,
    PRIMARY KEY (`p_id`),
    INDEX `hr_id` (`hr_id`),
    INDEX `u_id` (`ua_id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB

;

这是我存储的例程

BEGIN
SELECT pd.p_id, er.er_id, pd.flag, pd.delete_reason, pd.select_reason,
       AES_DECRYPT(pd.fname, encryptkey) AS fname,
       AES_DECRYPT(pd.age, encryptkey) AS age,
       AES_DECRYPT(pd.lname, encryptkey) AS lname,
       AES_DECRYPT(pd.home_phone, encryptkey) AS home_phone,
       AES_DECRYPT(pd.mobile_no, encryptkey) AS mobile_phone,
       AES_DECRYPT(pd.relation_with_patient, encryptkey) AS relation,
       AES_DECRYPT(pd.relative_name, encryptkey) AS relative_name,
       AES_DECRYPT(pd.street, encryptkey) AS street,
       AES_DECRYPT(pd.title, encryptkey) AS title,
       cl.city_name AS city,
       sl.state AS state,
       AES_DECRYPT(pd.sex, encryptkey) AS gender,
       AES_DECRYPT(pd.dob, encryptkey) AS dob,
       AES_DECRYPT(pd.email, encryptkey) AS email, pd.admit_flag, pd.entry_date, pd.mrn1,
       pd.mrn2, id.insurance_type, fcm.f_cm_name
FROM   patient_data AS pd
LEFT JOIN insurance_data AS id ON id.p_id = pd.p_id
LEFT   JOIN state_list AS sl ON sl.sl_id = AES_DECRYPT(pd.state,encryptkey)
LEFT   JOIN city_list AS cl ON cl.cl_id = AES_DECRYPT(pd.city,encryptkey)
LEFT   JOIN ehr_reg AS er ON er.p_id = pd.p_id
LEFT   JOIN facility_category_master AS fcm ON id.insurance_type = fcm.fc_m_id
WHERE  pd.hr_id = proc_hrid
AND    pd.flag <> '0'
GROUP BY pd.p_id
ORDER  BY pd.entry_date DESC, pd.p_id DESC ;
END

1 个答案:

答案 0 :(得分:0)

您希望从此查询中获得多少行?如果只有一个,我不明白为什么它会慢。

如果你有数千人,那么接受获取数千行需要时间。

此索引可能帮助:

INDEX(hr_id, flag, p_id)

或者,也许所有LEFT JOINs都很多:1?也就是说,对于给定的p_id只有一个保险,州,城市,ehr和设施吗?如果是这样,您不需要GROUP BY。这将绕过一些浪费的步骤。

你可以替换

sl.state AS state,
LEFT   JOIN state_list AS sl ON sl.sl_id = AES_DECRYPT(pd.state,encryptkey)

( SELECT state FROM state_list
       WHERE sl_id = AES_DECRYPT(pd.state,encryptkey) ) AS state,

我更愿意推动像城市和城市这样的事情。使用单个连接而不是单独的标准化来说明进入另一个表。

我无法想象二进制标志(例如性别)是最安全的。通过观察相对人群,即使state也可能很快被破解。

我建议您收集不需要搜索的列并将它们放入单个JSON字符串中,然后对其进行加密。那会更安全。

并没有关于AES例程如此容易破解的事情,以至于它们被禁止用于所有但是微不足道的用途。你的应用看起来比这更严重。

对不起,但性能需要退居二线。聘请安全顾问。