我正在 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
答案 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例程如此容易破解的事情,以至于它们被禁止用于所有但是微不足道的用途。你的应用看起来比这更严重。
对不起,但性能需要退居二线。聘请安全顾问。