Я работаю в СУБД (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
Сколько строк вы ожидаете получить от этого запроса? Если только один, я не понимаю, почему это будет медленно.
Если вы получаете тысячи, то примите, что для извлечения тысяч строк требуется время.
Этот индекс может быть Помогите:
INDEX(hr_id, flag, p_id)
Или, может быть, все LEFT JOINs
много: 1 ?? То есть есть только один страховка, штат, город, эр и объект для данного p_id
? Если это так, вам не нужно 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 настолько легко взламываются, что их запрещают для любого, кроме тривиального использования. Ваше приложение выглядит более серьезным, чем это.
Извините, но производительность должна отойти на второй план. Наймите консультанта по безопасности.
Других решений пока нет …