How can i execute this query faster? - mysql

This is my query:
create table vi_all as
select
d.primaryid, d.age, d.gndr_cod, d.wt, d.wt_cod, d.reporter_country,
dr.primaryiddrug, dr.role_cod, dr.drug_name,
r.primaryidreac, r.pt,
o.primaryidoutc, o.outc_cod,
i.primaryidindi, i.indi_pt
FROM demo d,
drug dr,
reac r,
outc o,
indi i;
Each table contains at least 80K records and more than 20 fields so its getting really tough to execute select statement on multiple tables; and i just want 4 or 3 fields from each table so i thought of this, but the above query has taken more than 5 hours but still has not given back any result.

My crystal ball says you need something like this:
create table vi_all as
select
d.primaryid, d.age, d.gndr_cod, d.wt, d.wt_cod, d.reporter_country,
dr.primaryiddrug, dr.role_cod, dr.drug_name,
r.primaryidreac, r.pt,
o.primaryidoutc, o.outc_cod,
i.primaryidindi, i.indi_pt
FROM demo d
LEFT JOIN drug dr ON d.drug=dr.id
LEFT JOIN reac r ON d.reac=r.id
LEFT JOIN outc o ON d.outc=o.id
LEFT JOIN indi i ON d.indi=i.id;
As far as I can tell your query is selecting all results from all tables but not assocating them in anyways so, you can maybe get duplicate data in the newly created table. Also, if you have some good foreign keys to associate those tables, the performance will be considerably better.

Related

Join clause from one table to another to where one table has its foreign key mixed

So, I wish to join two tables (reservation and facility_items). The reservation.facility_item_id is composed of multiple facility_item_id in a single row. And now I am having trouble joining them because I can't connect the reservation.facility_item_id to facility_items.facility_item_id
Here is the structure of my tables:
reservation
facility_item
reservation content
facility_item content
`SELECT * FROM reservations r
JOIN facility_items f on r.facility_item_id IN
(
SELECT facility_item_id
FROM facility_items
)`
lmao. I do not even know what I am doing but thats my start.
Expected result should show 3 facility_item_id but instead, I got this:
Wow, I really didn't check the content on the tables, it is indeed more complicated than a simple join. I guess you are complicating things because this a 1xN relation and you are storing it on the wrong side (the 1 side instead of the N side).
You should have a field in your facility table which shoud store the ID of the reservation. Then a simple join will suffice:
SELECT *
FROM reservations r JOIN facility f
ON r.reservation_id = f.reservation_id
First attempt, Won't work
It seems that a simple join should suffice. Can you try this one?
SELECT *
FROM reservations r JOIN facility_items f
ON r.facility_item_id = f.facility_item_id

fast way to get number of records in mysql

I'm writing a query in mysql to join two tables. And both tables have more than 50,000 records.
Table EMP Columns
empid,
project,
code,
Status
Table EMPINFO
empid,
project,
code,
projecttype,
timespent,
skills
In each table there is candidate key [empid, project, code]
So when I join the table using INNER join
like this INNER JOIN
ON a.empid = b.empid
and a.project = b.project
and a.code = b.code
I'm getting the result, but if I add count(*) in outer query to count number of records, it takes lot of time something connection gets failed.
Is there any way to speed up to get number of records ?
And I would like to hear more suggestions to speed up inner join query as well having same candidate key in both tables.
INDEX(empid, project, code) -- in any order.
Are these tables 1:1? If so, why do the JOIN in order to do the COUNT?
Please provide SHOW CREATE TABLE. (If there are datatype differences, this could be a big problem.)
Please provide the actual SELECT.
How much RAM do you have? Please provide SHOW VARIABLES LIKE '%buffer%';.

How to Do Efficient JOIN on multiple table in MySQL or SQL Server?

I am struggling to join multiple table in mySQL or SQL Server and keep the performance fast.
I have this table:
table songs
songID|songName
---------------
01|diamond
02|goodbye
table singersong
songID|singerID
---------------
01|15
02|22
table singers
singerID|singerName|Sex
------------------------
15| Rihanna | F
22| Air Supply | M
And I want my result like this:
songID|songName|singerName|Sex
------------------------------
01|diamond|Rihanna|F
02|goodbye|Air Supply| M
My Query is like this
SELECT s.songID, s.songName, sr.singerName, sr.Sex
FROM songs s, singersong ss, singer sr
WHERE
ss.songID = s.songID AND
ss.singerID = sr.singerID
ORDER BY s.songID
And it's performing very very slow.. is there anyway to make this query simpler or more efficient ?
Thanks very much for the help..
LL
Specify the conditions to join on. Your current query, depending upon the whims of the optimiser, may be producing a cartesian product between all tables and then filtering the result. Also make sure you have indexes and FKs setup properly.
SELECT s.songID, s.songName, sr.singerName, sr.Sex
FROM songs s
LEFT JOIN singersong ss ON s.songID = ss.songID
LEFT JOIN singer sr ON ss.singerID = sr.singerID
ORDER BY s.songID
Replace LEFT JOIN with INNER JOIN if you do not want null values returned when there are no matching entries in a related table.
Your syntax is not the modern style, but it should work fine. For performance, make sure you have indexes on all the columns used for the join: songID and singerID.
It's not enough just have indexes, you need multi-column index that spans the join table in the direction of travel, i.e if you are starting from Song and going to Singer the index would be:
INDEX songSinger (songID,singerID)
And if you were querying from Singer to Song, the index would be:
INDEX SingerSong (singerID,songID)
If you only have one column indexed, then MySQL will use the index to get the set of results from table singersong, load the results and then scan down that list of results for the next step of the join.
However, If you have an index that spans two columns, MySQL doesn't even load the join table, it just uses the index.

Negative INNER JOIN [Without LEFT JOIN & IS NULL]

I have 2 tables with tth hashes, and i need to get which of them, who exist in first table but not exist in second table.
I'll try something like this:
SELECT f.*
FROM files as f
LEFT JOIN trans as t ON t.tth=f.tth
WHERE t.id IS NULL
But it's working very slow, in first table 65k lines, and second table with 130k lines, so query working for ~5 minutes.
Here exist another way?
Thanks.
P.S. All columns in both tables having indexes.
Thanks, OMG Ponies, I read an article on the link, and a little optimizing method using NOT IN, query rate was ~ 0.6 seconds.
SELECT f.*
FROM files as f
WHERE
f.tth NOT IN (
SELECT trans.tth
FROM trans as t
-- We do not need to look entries across entire table, only from already matched, so create selection "limits" with INNER JOIN.
INNER JOIN files ON files.tth=t.tth
)

MySQL Join with many (fields) to one (secondary table) relationship

I have a query I need to perform on a table that is roughly 1M records. I am trying to reduce the churn, but unfortunately there is a UNION involved (after i figure this join out), so that may be a question for another day.
The records and data I need to get reference 3 fields in a table that need each pull a description from another table and return it in the same record, but when i do the Inner join i was thinking, it either returns only 1 field fromt he other table, or multiple records from he original table.
Here are some screen shots of the tables and their relationship:
Primary table containing records (1 each) with the physician record I want to pull, including up to 3 codes that can be listed in the "taxonomy" table.
Secondary table containing records (1 each) with the "Practice" field I want to pull.
A Quick glance of the relationship i'm talking about
I presume that if perform an inner join matching the 3 fields in the physicians table, that it will have to iterate that table multiple times to pull each taxonomy code .. but I still can't even figure the syntax to easily pull all of these codes instead of just 1 of them.
i've tried this:
SELECT
taxonomy_codes.specialization,
physicians.provider_last_name,
physicians.provider_first_name,
physicians.provider_dba_name,
physicians.legal_biz_name,
physicians.biz_practice_city
FROM
taxonomy_codes
INNER JOIN physicians ON physicians.provider_taxonomy_code_1 = taxonomy_codes.taxonomy_codes OR physicians.provider_taxonomy_code_2 = taxonomy_codes.taxonomy_codes OR physicians.provider_taxonomy_code_3 = taxonomy_codes.taxonomy_codes
First, the query churns a lot and it only returns one taxonomy specialty result which I presume is because of the OR in the join statement. Any help would be greatly appreciated.
Thank you,
Silver Tiger
You have to join the taxonomy_codes table multiple times:
SELECT p.provider_last_name, p...., t1.specialization as specialization1, t2.specialization as specialization2, t3.specialization as specialization3
FROM physicians p
LEFT JOIN taxonomy_codes t1 ON t1.taxonomy_codes = provider_taxonomy_code_1
LEFT JOIN taxonomy_codes t2 ON t2.taxonomy_codes = provider_taxonomy_code_2
LEFT JOIN taxonomy_codes t3 ON t3.taxonomy_codes = provider_taxonomy_code_3