복붙노트

[SQL] 어떻게 SQL 쿼리를 속도를? 인덱스?

SQL

어떻게 SQL 쿼리를 속도를? 인덱스?

나는 다음과 같은 데이터베이스 구조를 가지고 :

create table Accounting
(
  Channel,
  Account
)

create table ChannelMapper
(
  AccountingChannel,
  ShipmentsMarketPlace,
  ShipmentsChannel
)

create table AccountMapper
(
  AccountingAccount,
  ShipmentsComponent
)

create table Shipments
(
   MarketPlace,
   Component,
   ProductGroup,
   ShipmentChannel,
   Amount
 )

나는 다음과 같은 쿼리가이 테이블에서 실행하고 나는 가능한 한 빨리 실행할 쿼리를 최적화하기 위해 노력하고 있습니다 :

 select Accounting.Channel, Accounting.Account, Shipments.MarketPlace
 from Accounting join ChannelMapper on Accounting.Channel = ChannelMapper.AccountingChannel

 join AccountMapper on Accounting.Accounting = ChannelMapper.AccountingAccount
 join Shipments on 
 (
     ChannelMapper.ShipmentsMarketPlace = Shipments.MarketPlace
     and ChannelMapper.AccountingChannel = Shipments.ShipmentChannel
     and AccountMapper.ShipmentsComponent = Shipments.Component
 )
 join (select Component, sum(amount) from Shipment group by component) as Totals
    on  Shipment.Component = Totals.Component

어떻게하면 가능한 한 빨리이 쿼리를 실행해야합니까? 나는 인덱스를 사용해야합니까? 열을의 테이블해야 I 지수, 그렇다면?

여기 내 쿼리 계획의 사진입니다 :

감사,

해결법

  1. ==============================

    1.인덱스는 데이터베이스에 필수적이다.

    인덱스는 데이터베이스에 필수적이다.

    "평신도"측면에서 말하기, 인덱스, 음 ... 바로 그이다. 당신은 숨겨진 둘째, 테이블로 인덱스 생각할 수있는 상점 두 가지 : 정렬 된 데이터와 테이블의 위치에 대한 포인터를.

    인덱스 작성에 대한 일부 엄지 손가락의 규칙 :

    나는 당신이이 글을 읽을 것을 권장합니다 : http://dev.mysql.com/doc/refman/5.5/en/using-explain.html

  2. ==============================

    2.귀하는 가장 먼저보아야 할한다 합류했다. 인덱스에 대한 두 가지 가장 눈에 띄는 후보는 계정 Mapper.Accounting 계정 및 채널 Mapper.AccountingChannel 있습니다.

    귀하는 가장 먼저보아야 할한다 합류했다. 인덱스에 대한 두 가지 가장 눈에 띄는 후보는 계정 Mapper.Accounting 계정 및 채널 Mapper.AccountingChannel 있습니다.

    당신은뿐만 아니라 Shipments.MarketPlace, Shipments.ShipmentChannel 및 Shipments.Component 색인 고려해야한다.

    그러나 인덱스를 추가하면 그들을 유지하는 작업 부하를 증가시킨다. 그들은이 쿼리에 당신에게 성능 향상을 줄 수도 있지만, 당신은 테이블을 업데이트하는 것은 허용 할 수 없을 정도로 느려지 사실을 발견했습니다. 어떤 경우에는, MySQL의 최적화는 테이블의 전체 검사가 빨리 인덱스로 접속하시면보다 결정할 수 있습니다.

    정말이 작업을 수행 할 수있는 유일한 방법은 벤치 마크를 한 후 당신이 다른 곳에서 성능 저하없는 동안, 당신은 여기에 원하는 결과를 얻고 만들 수있는 시스템을 당신에게 최고의 결과를 제공하고 나타나는 인덱스를 설정하는 것입니다. 무슨 일이 일어나고 있는지 알아 내기 위해 EXPLAIN 문을 잘 활용하고, 작은 테이블에 직접 또는 최적화에 의해 최적화가 더 큰 사람에 필요할 것 같은 최적화를하지 않을 수 있음을 기억하십시오.

  3. ==============================

    3.다른 세 개의 답변이 인덱스에 추가됩니다 있도록 인덱스가 덮여있는 것을 보인다. 당신은 어떤 위치를 항상 전체 이놈의 데이터베이스를 선택하는 것을 의미 조항이 없다. 사실, 데이터베이스 설계는 배송 날짜와이 점에 유용 아무것도하지 않습니다. 그것에 대해 생각합니다.

    다른 세 개의 답변이 인덱스에 추가됩니다 있도록 인덱스가 덮여있는 것을 보인다. 당신은 어떤 위치를 항상 전체 이놈의 데이터베이스를 선택하는 것을 의미 조항이 없다. 사실, 데이터베이스 설계는 배송 날짜와이 점에 유용 아무것도하지 않습니다. 그것에 대해 생각합니다.

    또한이있다 :

    join (select Component, sum(amount) from Shipment group by component) as Totals
    on  Shipment.Component = Totals.Component
    

    즉 잘하고 좋은 그러나 당신은이 하위 쿼리에서 아무 것도 선택하지 마십시오. 따라서 당신은 왜 그것을해야합니까? 당신은 합 (양)와 같은 무언가를 선택하려면 않은 경우 별칭은 SELECT 절에 사용할 수 있도록하는 것을 제공해야합니다.

  4. from https://stackoverflow.com/questions/17354219/how-to-speed-up-sql-queries-indexes by cc-by-sa and MIT license