Sign Up

Sign Up to our social questions and Answers Engine to ask questions, answer people’s questions, and connect with other people.

Have an account? Sign In

Have an account? Sign In Now

Sign In

Login to our social questions & Answers Engine to ask questions answer people’s questions & connect with other people.

Sign Up Here

Forgot Password?

Don't have account, Sign Up Here

Forgot Password

Lost your password? Please enter your email address. You will receive a link and will create a new password via email.

Have an account? Sign In Now

You must login to ask a question.

Forgot Password?

Need An Account, Sign Up Here

Please briefly explain why you feel this question should be reported.

Please briefly explain why you feel this answer should be reported.

Please briefly explain why you feel this user should be reported.

Sign InSign Up

The Archive Base

The Archive Base Logo The Archive Base Logo

The Archive Base Navigation

  • SEARCH
  • Home
  • About Us
  • Blog
  • Contact Us
Search
Ask A Question

Mobile menu

Close
Ask a Question
  • Home
  • Add group
  • Groups page
  • Feed
  • User Profile
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Buy Points
  • Users
  • Help
  • Buy Theme
  • SEARCH
Home/ Questions/Q 923955
In Process

The Archive Base Latest Questions

Editorial Team
  • 0
Editorial Team
Asked: May 15, 20262026-05-15T19:16:33+00:00 2026-05-15T19:16:33+00:00

It seems that all questions regarding this topic are very specific, and while I

  • 0

It seems that all questions regarding this topic are very specific, and while I value specific examples, I’m interested in the basics of SQL optimization. I am very comfortable working in SQL, and have a background in hardware/low level software.

What I want is the tools both tangible software, and a method to look at the mysql databases I look at on a regular basis and know what the difference between orders of join statements and where statements.

I want to know why an index helps, like, exactly why. I want to know specifically what happens differently, and I want to know how I can actually look at what is happening. I don’t need a tool that will breakdown every step of my SQL, I just want to be able to poke around and if someone can’t tell me what column to index, I will be able to get out a sheet of paper and within some period of time be able to come up with the answers.

Databases are complicated, but they aren’t THAT complicated, and there must be some great material out there for learning the basics so that you know how to find the answers to optimization problems you encounter, even if could hunt down the exact answer on a forum.

Please recommend some reading that is concise, intuitive, and not afraid to get down to the low level nuts and bolts. I prefer online free resources, but if a book recommendation demolishes the nail head it hits I’d consider accepting it.

  • 1 1 Answer
  • 0 Views
  • 0 Followers
  • 0
Share
  • Facebook
  • Report

Leave an answer
Cancel reply

You must login to add an answer.

Forgot Password?

Need An Account, Sign Up Here

1 Answer

  • Voted
  • Oldest
  • Recent
  • Random
  1. Editorial Team
    Editorial Team
    2026-05-15T19:16:34+00:00Added an answer on May 15, 2026 at 7:16 pm

    You have to do a look up for every where condition and for every join…on condition. The two work the same.

    Suppose we write

    select name
    from customer
    where customerid=37;
    

    Somehow the DBMS has to find the record or records with customerid=37. If there is no index, the only way to do this is to read every record in the table comparing the customerid to 37. Even when it finds one, it has no way of knowing there is only one, so it has to keep looking for others.

    If you create an index on customerid, the DBMS has ways to search the index very quickly. It’s not a sequential search, but, depending on the database, a binary search or some other efficient method. Exactly how doesn’t matter, accept that it’s much faster than sequential. The index then takes it directly to the appropriate record or records. Furthermore, if you specify that the index is “unique”, then the database knows that there can only be one so it doesn’t waste time looking for a second. (And the DBMS will prevent you from adding a second.)

    Now consider this query:

    select name
    from customer
    where city='Albany' and state='NY';
    

    Now we have two conditions. If you have an index on only one of those fields, the DBMS will use that index to find a subset of the records, then sequentially search those. For example, if you have an index on state, the DBMS will quickly find the first record for NY, then sequentially search looking for city=’Albany’, and stop looking when it reaches the last record for NY.

    If you have an index that includes both fields, i.e. “create index on customer (state, city)”, then the DBMS can immediately zoom to the right records.

    If you have two separate indexes, one on each field, the DBMS will have various rules that it applies to decide which index to use. Again, exactly how this is done depends on the particular DBMS you are using, but basically it tries to keep statistics on the total number of records, the number of different values, and the distribution of values. Then it will search those records sequentially for the ones that satisfy the other condition. In this case the DBMS would probably observe that there are many more cities than there are states, so by using the city index it can quickly zoom to the ‘Albany’ records. Then it will sequentially search these, checking the state of each against ‘NY’. If you have records for Albany, California these will be skipped.

    Every join requires some sort of look-up.

    Say we write

    select customer.name
    from transaction
    join customer on transaction.customerid=customer.customerid
    where transaction.transactiondate='2010-07-04' and customer.type='Q';
    

    Now the DBMS has to decide which table to read first, select the appropriate records from there, and then find the matching records in the other table.

    If you had an index on transaction.transactiondate and customer.customerid, the best plan would likely be to find all the transactions with this date, and then for each of those find the customer with the matching customerid, and then verify that the customer has the right type.

    If you don’t have an index on customer.customerid, then the DBMS could quickly find the transaction, but then for each transaction it would have to sequentially search the customer table looking for a matching customerid. (This would likely be very slow.)

    Suppose instead that the only indexes you have are on transaction.customerid and customer.type. Then the DBMS would likely use a completely different plan. It would probably scan the customer table for all customers with the correct type, then for each of these find all transactions for this customer, and sequentially search them for the right date.

    The most important key to optimization is to figure out what indexes will really help and create those indexes. Extra, unused indexes are a burden on the database because it takes work to maintain them, and if they’re never used this is wasted effort.

    You can tell what indexes the DBMS will use for any given query with the EXPLAIN command. I use this all the time to determine if my queries are being optimized well or if I should be creating additional indexes. (Read the documentation on this command for an explanation of its output.)

    Caveat: Remember that I said that the DBMS keeps statistics on the number of records and the number of different values and so on in each table. EXPLAIN may give you a completely different plan today than it gave yesterday if the data has changed. For example, if you have a query that joins two tables and one of these tables is very small while the other is large, it will be biased toward reading the small table first and then finding matching records in the large table. Adding records to a table can change which is larger, and thus lead the DBMS to change its plan. Thus, you should attempt to do EXPLAINS against a database with realistic data. Running against a test database with 5 records in each table is of far less value than running against a live database.

    Well, there’s much more that could be said, but I don’t want to write a book here.

    • 0
    • Reply
    • Share
      Share
      • Share on Facebook
      • Share on Twitter
      • Share on LinkedIn
      • Share on WhatsApp
      • Report

Sidebar

Related Questions

It seems that while I strive to maintain OO principles, it all seems so
I've read a couple similar questions regarding this topic on StackOverflow, but none of
There have been a few questions regarding this issue before; my understanding is that
I know that there are lot's of questons on this, but all seem to
I am working on a cross platform OpenGL project and it seems that all
The consensus seems to be that all foreign keys need to have indexes. How
In the Java Swing app I made it seems to me that all the
That seems simple enough, but all Django Queries seems to be 'SELECT *' How
Seems to be a problem that many people have, but all the answers I
Seems that This will be an easy question for you but this problem is

Explore

  • Home
  • Add group
  • Groups page
  • Communities
  • Questions
    • New Questions
    • Trending Questions
    • Must read Questions
    • Hot Questions
  • Polls
  • Tags
  • Badges
  • Users
  • Help
  • SEARCH

Footer

© 2021 The Archive Base. All Rights Reserved
With Love by The Archive Base

Insert/edit link

Enter the destination URL

Or link to existing content

    No search term specified. Showing recent items. Search or use up and down arrow keys to select an item.