I'm junior Ruby-mysql programmer and I want to know how to make my (Stored procedure )query result fast..
here is my Stored procedure and I'm using SQL_CACHE.. but I'm not sure.. the cache makes my procedure fast.. : (
DROP PROCEDURE IF EXISTS GET_AV //
CREATE PROCEDURE GET_AV()
BEGIN
DECLARE OVERALL FLOAT ;
DECLARE MALE FLOAT ;
DECLARE FEMALE FLOAT ;
DECLARE UNDER25 FLOAT ;
DECLARE ABOVE25 FLOAT ;
DECLARE UNDER25MALE FLOAT ;
DECLARE UNDER25FEMALE FLOAT ;
DECLARE ABOVE25MALE FLOAT ;
DECLARE ABOVE25FEMALE FLOAT ;
DECLARE CNT FLOAT;
#AVERAGE OVERALL
select SQL_CACHE avg(r.frq) as AVG_OVERALL INTO OVERALL from tbl_survey as s inner join tbl_respondent as r on s.s_id = r.s_id;
#AVERAGE MALE
select SQL_CACHE avg(r.frq) as AVG_MALE INTO MALE from tbl_survey as s inner join tbl_respondent as r on s.s_id = r.s_id WHERE GENDER = 1;
#AVERAGE FEMALE
select SQL_CACHE avg(r.frq) as AVG_FEMALE INTO FEMALE from tbl_survey as s inner join tbl_respondent as r on s.s_id = r.s_id WHERE GENDER = 2;
#AVERAGE UNDER25
select SQL_CACHE avg(r.frq) as AVG_UNDER_25 INTO UNDER25 from tbl_survey as s inner join tbl_respondent as r on s.s_id = r.s_id where AGE <= 25;
#AVERAGE ABOVE25
select avg(r.frq) as AVG_ABOVE_25 INTO ABOVE25 from tbl_survey as s inner join tbl_respondent as r on s.s_id = r.s_id where AGE >= 25;
#AVERAGE UNDER 25 & MALE
select SQL_CACHE avg(r.frq) as AVG_UNDER_25_MALE INTO UNDER25MALE from tbl_survey as s inner join tbl_respondent as r on s.s_id = r.s_id WHERE AGE <= 25 AND GENDER = 1;
#AVERAGE UNDER 25 & FEMALE
select SQL_CACHE avg(r.frq) as AVG_UNDER_25_FEMALE INTO UNDER25FEMALE from tbl_survey as s inner join tbl_respondent as r on s.s_id = r.s_id WHERE AGE <= 25 AND GENDER = 2;
#AVERAGE ABOVE25 & MALE
select SQL_CACHE avg(r.frq) as AVG_ABOVE_25_MALE INTO ABOVE25MALE from tbl_survey as s inner join tbl_respondent as r on s.s_id = r.s_id where AGE >=25 AND GENDER = 1;
#AVERAGE ABOVE25 & FEMALE
select SQL_CACHE avg(r.frq) as AVG_ABOVE_25_FEMALE INTO ABOVE25FEMALE from tbl_survey as s inner join tbl_respondent as r on s.s_id = r.s_id WHERE AGE >= 25 AND GENDER = 2;
SELECT OVERALL,MALE,FEMALE,UNDER25 ,ABOVE25 , UNDER25MALE,UNDER25FEMALE ,
ABOVE25MALE ,ABOVE25FEMALE;
END //
luckily its not too slow now.. but I want to know how to make it more and more fast and beautiful code way :(
BEGIN
SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; // These line helps to avoid locking table
<Your select Query>
SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
END
// As you are using same table number of times in the stored procedure
// You can create temp table for that. This will avoid scan whole table from db.
CREATE TEMPORARY TABLE IF NOT EXISTS tmptbl_survey ENGINE=MEMORY AS SELECT
* FROM tbl_survey
// Use temp table in the query
//Then drop temp table
DROP TABLE tmptbl_survey
Try it best of luck
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.