MySQL demorando para executar query

Olá amigos tenho duas tabelas em um projeto aqui um responsavel pelo armazenamento das UF e outra dos MUNICIPIOS do brasil
ao executar uma query para listar todas a cidades da base de dados o mysql esta demorando (tempo total: 5 minutos 34 segundos) para listar pouco mais de
5 mil registros que contem nessa entidade alguem sabe oq pode ser isso ?

segue os códigos e imagem das entidades da base de dados

Classe conexão


import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

public class ConexaoMySQL {

    private String driver = "com.mysql.jdbc.Driver";
    private String url = "jdbc:mysql://localhost:3306/dados_freedom";
    private String usuario = "root";
    private String senha = "mysqls3rv3r";
    protected  PreparedStatement pstm;
    protected  Statement stm;
    protected  ResultSet rs;


    //conecta na base de dados
    public Connection getConexao() throws Exception {
        Class.forName(driver);
        Connection con = DriverManager.getConnection(url, usuario, senha);
        return con;
    }
    //metodo statement
    public Statement getStatement() throws Exception {
        return getConexao().createStatement();
    }
    //prepara o SQL a ser executado na base de dados
    public PreparedStatement getPreparedStatement(String sql) throws Exception {
        return getConexao().prepareStatement(sql);
    }
}

Modelos

Uf

 * */
import java.io.Serializable;

import com.towel.el.annotation.Resolvable;

public class Uf implements Serializable {
	private static final long serialVersionUID = 1L;
	
	/*Atributos do objeto UF*/
	@Resolvable(colName="Id")
	private int 	id;
	@Resolvable(colName="Codigo")
	private String 	codigo;
	@Resolvable(colName="Sigla")
	private String 	sigla;
	@Resolvable(colName="Nome")
	private String 	nome;
	@Resolvable(colName="Ativo")
	private boolean ativo;
	
	/*Gets e Sets dos atributos do objeto UF*/
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getCodigo() {
		return codigo;
	}
	public void setCodigo(String codigo) {
		this.codigo = codigo;
	}
	public String getSigla() {
		return sigla;
	}
	public void setSigla(String sigla) {
		this.sigla = sigla;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public boolean isAtivo() {
		return ativo;
	}
	public void setAtivo(boolean status) {
		this.ativo = status;
	}
}

Municipio


import java.io.Serializable;

import com.towel.el.annotation.Resolvable;

public class Municipio implements Serializable{
	
	/*
	 * Atributos do obj Municipio
	 * */
	private static final long serialVersionUID = 1L;
	@Resolvable(colName="id")
	private int id;
	@Resolvable(colName="Codigo uf")
	private Uf iduf;
	@Resolvable(colName="Codigo do municipio")
	private String codigo;
	@Resolvable(colName="Nome")
	private String nome;
	@Resolvable(colName="Cep")
	private String cep;
	@Resolvable(colName="Ativo")
	private boolean ativo;
	
	/*
	 * Metodos Gets e Sets
	 * */
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public Uf getIduf() {
		return iduf;
	}
	public void setIduf(Uf iduf) {
		this.iduf = iduf;
	}
	public String getCodigo() {
		return codigo;
	}
	public void setCodigo(String codigo) {
		this.codigo = codigo;
	}
	public String getNome() {
		return nome;
	}
	public void setNome(String nome) {
		this.nome = nome;
	}
	public String getCep() {
		return cep;
	}
	public void setCep(String cep) {
		this.cep = cep;
	}
	public boolean isAtivo() {
		return ativo;
	}
	public void setAtivo(boolean ativo) {
		this.ativo = ativo;
	}
}

Daos

UfDAO


import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.LinkedList;
import java.util.List;

public class UfDAO extends ConexaoMySQL {

    public Uf getUf(long id) throws Exception {
        PreparedStatement pst = null;
        ResultSet rst = null;
        Connection con = getConexao();
        Uf uf = new Uf();
        String SQL = "Select * from Uf Where uf.id = ?";
        pst = getPreparedStatement(SQL);
        pst.setLong(1, id);
        rst = pst.executeQuery();
        if (rst.next()) {
            uf = populaUf(rst);
        }
        pst.close();
        rst.close();
        //con.commit();
        con.close();
        return uf;
    }

    public List<Uf> lista() throws Exception {
        String sql = "Select * from Uf";
        Connection con = getConexao();
        PreparedStatement pst = null;
        ResultSet rst = null;
        Uf uf = new Uf();
        List<Uf> listas = new LinkedList<Uf>();
        pst = getPreparedStatement(sql);
        rst = pst.executeQuery();
        while (rst.next()) {
            uf = populaUf(rst);
            listas.add(uf);
        }
        
        pst.close();
        rst.close();
        //con.commit();
        con.close();
        return listas;
    }

    //popula uf
    public Uf populaUf(ResultSet rs) throws Exception {
        Uf uf = new Uf();
        uf.setId(rs.getInt(1));
        uf.setCodigo(rs.getString(2));
        uf.setSigla(rs.getString(3));
        uf.setNome(rs.getString(4));
        uf.setAtivo(rs.getBoolean(5));
        return uf;
    }
}

MunicipioDAO


import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.LinkedList;
import java.util.List;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
/**
 *
 * @author Willian
 */
public class MunicipioDAO extends ConexaoMySQL {

    UfDAO ufdao = new UfDAO();

    public List<Municipio> listar() throws Exception {
        List<Municipio> lista = new LinkedList<Municipio>();
        String sql = "Select * from Municipio";
        Connection con = getConexao();
        PreparedStatement pst = null;
        ResultSet rst = null;
        Municipio m = new Municipio();
            pst = getPreparedStatement(sql);
            rst = pst.executeQuery();
                while(rst.next()){
                    m = populaMunicipio(rst);
                    lista.add(m);                    
                }
        pst.close();
        rst.close();
        con.close();
        return lista;
    }

    public Municipio populaMunicipio(ResultSet rs) throws Exception {
        Municipio m = new Municipio();
        m.setId(rs.getInt(1));
        m.setIduf(ufdao.getUf(rs.getInt(2)));
        m.setCodigo(rs.getString(3));
        m.setNome(rs.getString(4));
        m.setCep(rs.getString(5));
        m.setAtivo(rs.getBoolean(6));
        return m;
    }
}

Classe para listar os registros

import java.util.LinkedList;
import java.util.List;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author Willian
 */
public class Main {
    public static void main(String[] args) {
        
        List<Municipio> lista = new LinkedList<Municipio>();
        try {
            lista = new MunicipioDAO().listar();
            for(int i=0; i<lista.size();i++){
                System.out.println(lista.get(i).getNome()+" - "+lista.get(i).getIduf().getSigla()+"\n");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

imagem do DER