2010-06-04 2 views
1

나는 쿼리가 잘못 작성되었다는 것을 알고 있고 트래픽이 많이 발생하면 데이터베이스가 하드 드라이브에 충돌하여 페이지가 갈리는 속도가 느려진다 ... 쿼리를 작성해야한다고 생각합니다. CURDATE에서 지난 30 일 동안 CREATE VIEW를 기반으로 ?? 그러나 어디서부터 시작해야 할 지, 아니면 데이터베이스에 대한보다 효율적인 쿼리가 될지 확실하지 않은가요?지난 30 일 동안 MYSQL에 대한보기 만들기

은 어쨌든, 여기 .. ​​

$query_Recordset6 = "SELECT `date`, title, category, url, comments 
         FROM cute_news 
         WHERE category LIKE '%45%' 
        ORDER BY `date` DESC"; 

어떤 도움이나 제안이 좋은 것 내가 쓴 샘플 쿼리입니다! 나는 이것과 같은 약 11 개의 질의를 가지고 있지만, 나는 이것들 중 하나에 대한 도움을 얻을 수 있다면 자신감이있다, 그럼 나머지 것들을 구현할 수있다 !!

답변

0
SELECT `date`, title, category, url, comments 
         FROM cute_news 
         WHERE category LIKE '%45%' 
        ORDER BY `date` DESC 

LIKE '%45%'은 전체 테이블 스캔을 수행해야 함을 의미합니다. 카테고리 목록을 열에 저장하고 있습니까? 그렇다면 category와 news_article_id를 저장하는 새로운 테이블을 생성하면 인덱스를 사용하여 일치하는 레코드를 훨씬 더 효율적으로 검색 할 수 있습니다. 비교 값의 좌측에 와일드 카드를 씌우고

2

:

LIKE '%xyz' 

... 인덱스가 하나 존재하는 경우에도 사용될 수 없다는 것을 의미한다. Full Text Searching (FTS), which means adding full text indexing을 사용하는 것이 좋습니다.

데이터를 표준화하는 것이 고려해야 할 또 다른 단계입니다. 범주는 별개의 테이블에 있어야합니다.

+0

더 잘 작동하는지 궁금하십니까? SELECT ... FROM ... LIMIT 50 – eberswine

0

좋습니다, 심령 디버깅을위한 시간입니다.

내 생각에 데이터베이스 복수화 열을 두 개의 열 즉, cute_news의 기본 키와 범주 ID가있는 별도의 테이블로 분할하여 데이터베이스 정규화를 통해 쿼리 성능이 상당히 향상 될 것입니다.

이렇게하면 먼저 테이블을 구문 분석하지 않고도 해당 테이블을 카테고리 테이블에 직접 연결할 수 있습니다.

또는 Chris Date가 말한 것처럼 "모든 행과 열 교차 영역에는 적용 가능한 도메인의 값이 하나뿐입니다."

0

LIKE '% XXX %'이 (가)있는 항목은 모두 느려집니다. 그것의 느린 작업.

카테고리와 같이 카테고리를 다른 테이블로 분리하고 cute_news 테이블에서 외래 키를 사용할 수 있습니다. 그렇게하면 category_id를 가질 수 있으며, 쿼리에서이를 훨씬 빠르게 사용할 수 있습니다.


또한 CREATE VIEW를 사용하는 이유에 대해 잘 모르겠습니다. 조회수가 실제로 속도에 도움이되지는 않습니다. MySQL이 본질적으로 가정하지 않는 구체화 된보기가 아니라면.

0

데이터베이스가 심하게 타격을 입는 경우 솔루션은보기를 만들지 않으며 (보기는 기본적으로 데이터베이스에서 수행 할 작업량과 기본적으로 같습니다.) 솔루션은 결과를 캐시하는 것입니다.

이것은 특히 소리처럼 들리면 30 일에 한 번만 데이터를 새로 고쳐야하기 때문에 특히 적합합니다.

0

나는 category 열이 "12,34,45,78"과 같은 범주 값 목록이라고 생각하십니까?

이것은 좋은 관계형 데이터베이스 디자인이 아닙니다. 좋지 않은 이유 중 하나는 발견 한 것입니다. 그 목록의 중간에 나타날 수있는 부분 문자열을 검색하는 것은 매우 느립니다.

어떤 사람들은 대신 와일드 카드로 LIKE 술어의 전체 텍스트 검색을 사용하여 제안,하지만 당신은 행마다 하나 개의 범주 값을 나열 할 수 있습니다이 경우에 당신의 cute_news 테이블에 다시 참조하여, 다른 테이블을 만들 간단했다 :

그런 다음
CREATE TABLE cute_news_category (
    news_id INT NOT NULL, 
    category INT NOT NULL, 
    PRIMARY KEY (news_id, category), 
    FOREIGN KEY (news_id) REFERENCES cute_news(news_id) 
) ENGINE=InnoDB; 

당신은 조회 할 수 있습니다 그것은 훨씬 빨리 갈 수 있습니다 :

SELECT n.`date`, n.title, c.category, n.url, n.comments 
FROM cute_news n 
JOIN cute_news_category c ON (n.news_id = c.news_id) 
WHERE c.category = 45 
ORDER BY n.`date` DESC 
0

상관 없음 대답은 추측, 쇼 :
- 관련 SHOW는 T를 CREATE ABLE 출력
- 일반적인 쿼리의 EXPLAIN 출력.

그리고 Bill Karwin의 의견이 확실히 적용됩니다.

결국 &의 데이터를 최적화하면 지난 30 일간의 테이블로 데이터를 샘플링하는 것이 여전히 필요할 수 있습니다.이 경우 일일 cronjob을 실행하는 것이 좋습니다.

관련 문제