Tại sao nhà (rất nhiều) chậm hơn các trang khác?


7

Tôi đang cố điều chỉnh một trang web wordpress chịu thời gian tải chậm và tôi phát hiện ra rằng trang chủ dường như mất nhiều thời gian hơn để tải. Đó không phải là do nội dung vì tôi chỉ đang xem xét thời gian yêu cầu cơ sở kết thúc (có thể xem qua fireorms trong firefox).

Ngoài ra, tôi đã thử sao chép mã index.php trong một trang tùy chỉnh và cùng một mã chính xác tải trong khoảng 1 giây trong khi nhà chính tải trong khoảng 7. Tôi nhận thấy rằng các trang đơn lẻ được tải nhanh hơn và lúc đầu tôi nghĩ rằng đó là do sự khác biệt về nội dung, nhưng sau bài kiểm tra này tôi không chắc điều gì gây ra điều này.

Có nhiều thứ mà wordpress làm đằng sau hậu trường chỉ cho chỉ mục chính? Có cách nào khác để giải thích tình huống này và quan trọng hơn là khắc phục nó để trang chủ tải nhanh hơn?

CẬP NHẬT - GIẢI PHÁP TRỰC TIẾP

Sau rất nhiều lần thử, tôi đã tạo một trang mới gọi là home sử dụng index.phplàm mẫu tùy chỉnh (không phải bản sao, cùng một tệp). Tôi đã chuyển hướng bất kỳ cuộc gọi nào đến đường dẫn cơ sở đến nó (thông qua viết lại nội bộ của wordpress) và tôi có cùng trang chủ như trước đây, chỉ được tải vào 1/6 thời gian. Trong khi tôi hài lòng với kết quả này, tôi thực sự muốn hiểu chuyện gì đang xảy ra.

CẬP NHẬT KHÁC

Vì vậy, vấn đề dường như là tôi không thể sử dụng trang động (theo nghĩa của wordpress) với trang này, nó chỉ hoạt động tốt với trang "tĩnh" tùy chỉnh nơi tôi chèn nội dung qua nhiều chức năng khác nhau, Loop bình thường làm cho ngôi nhà rất hay chậm (với giới hạn bộ nhớ cao) hoặc chỉ để trống (giới hạn bộ nhớ thấp, tập lệnh không thành công).

Như được đề xuất trong câu hỏi này , tôi đã tạo một ngôi nhà tĩnh được liên kết với một trang tùy chỉnh và nó hoạt động tốt. Tôi cũng đã tạo một trang blog (một lần nữa với một mẫu tùy chỉnh) cũng hoạt động tốt (trong đó "fine" có nghĩa là nó hiển thị trang thử nghiệm trống của tôi chỉ chứa một từ và không có mã) trừ khi tôi chỉ định nó là "Trang bài viết" trong quản trị viên -> Đọc cài đặt. Nói cách khác, có vẻ như ngay khi wordpress nhìn thấy một trang động (trang được cho là giữ Vòng lặp chính), nó sẽ làm một cái gì đó rất nặng, ăn rất nhiều ram.

Vẫn đang tìm kiếm nguyên nhân của việc này, tôi có thể giải quyết nó nhưng tôi thực sự muốn hiểu vấn đề là gì.

Chỉnh sửa: thêm tiền thưởng

Thông tin thêm: Tôi đã thử vô hiệu hóa tất cả các plugin, wordpress được cập nhật lên phiên bản mới nhất.

EDIT THÊM: CHỈ SỐ BẢNG

wp_posts:

PRIMARY KEY  (`ID`),
KEY `type_status_date` (`post_type`,`post_status`(1),`post_date`,`ID`),
KEY `post_status_date_gmt` (`post_status`(1),`post_date_gmt`),
KEY `post_date` (`post_date`),
KEY `post_date_gmt` (`post_date_gmt`),
KEY `post_parent` (`post_parent`),
KEY `post_name` (`post_name`),
KEY `post_status` (`post_status`),
KEY `post_author` (`post_author`),
FULLTEXT KEY `post_related` (`post_name`,`post_content`),
FULLTEXT KEY `post_content` (`post_content`,`post_title`),

wp_term_relationships:

PRIMARY KEY  (`object_id`,`term_taxonomy_id`),
KEY `term_taxonomy_id` (`term_taxonomy_id`)

wp_term_taxonomy:

PRIMARY KEY  (`term_taxonomy_id`),
UNIQUE KEY `term_id_taxonomy` (`term_id`,`taxonomy`),
KEY `taxonomy` (`taxonomy`)

@kemp - Trừ khi tôi thiếu nó, bạn chưa bao gồm một liên kết đến trang chủ để chúng tôi có thể tự nhìn thấy nó. Bạn có thể làm điều đó?
MikeSchinkel

1
Ngoài ra, vui lòng thêm các công cụ định hình này vào trang web của bạn: wordpress.stackexchange.com/questions/1567/iêu để cho phép xem:http://example.com?debug=sql
Denis de Bernardy

@Denis đã thử điều đó, dường như không thể nhận được bất kỳ đầu ra nào. Tôi nhận được một trang trống và lỗi máy chủ nội bộ không thường xuyên với thông báo này trong nhật ký:Premature end of script headers: index.php
Matteo Riva

@kemp bạn đã xóa nội dung bộ đệm và thử lại các bài kiểm tra với 2 trang giống nhau (động / tĩnh)?
edelwater

Duh, tôi chỉ lưu ý rằng các URL của bạn sử dụng cấu trúc permalink dài dòng. Điều gì xảy ra khi bạn sử dụng một trong các cấu trúc dựa trên ngày / tên được đề xuất, ví dụ / YYYY / MM / slug /?
Denis de Bernardy

Câu trả lời:


8

Tôi xin để khác với hai ý kiến ​​trước.

Sử dụng một trang chủ tĩnh dẫn đến WP sử dụng quét chỉ mục trên khóa chính của bảng bài đăng, so với quét chỉ mục (ồ rất thường xuyên) trên post_date, status hoặc post_parent trong bảng bài viết.

Về bản chất, trang chủ bị chết chậm do thiết kế cơ sở dữ liệu kém trong WP. Lược đồ có các chỉ mục nhiều màu lố bịch trên các bảng phân loại mà MySQL chỉ đơn giản bỏ qua một khi bạn có một lượng bài viết có ý nghĩa. Thực tế là chúng ta đang sử dụng một bảng quá nhiều cho các nguyên tắc phân loại cũng không giúp được gì.

Trong cơ sở dữ liệu, thêm an toàn các chỉ mục trên:

CREATE INDEX extra_posts ON posts (post_type,post_status,post_date DESC)
CREATE INDEX extra_term_rel ON term_relationships(term_taxonomy_id,object_id)
CREATE INDEX extra_term_tax ON term_taxonomy(taxonomy,term_taxonomy_id,term_id)

Nó sẽ không hoàn hảo, nhưng ít nhất WP sẽ có thể sử dụng các kế hoạch vòng lặp lồng nhau dựa trên chỉ mục trên trang trước của bạn ...

Ồ, và ... nếu bạn đang sử dụng bất kỳ loại bài đăng tùy chỉnh nào trên trang trước của mình, bạn cũng cần thêm:

posts(post_status,post_date DESC)

Khác không có chỉ mục nào sẽ được sử dụng cho tất cả các truy vấn chính vì các mệnh đề OR.


@Denis bạn có thể vui lòng xem lại các chỉ mục? Tôi đã cập nhật câu hỏi vì chúng không phù hợp trong một bình luận. Ngoài ra, 13.200 bài viết có thể được coi là quá nhiều? Điều lạ lùng theo quan điểm của tôi là vòng lặp bình thường trong các trang chuyên mục hoạt động hoàn toàn tốt.
Matteo Riva

13200 hàng rất ít trong cơ sở dữ liệu trừ khi chúng được truy vấn kém. Trang web dev của tôi với một vài bài viết kỳ lạ đọc toàn bộ trang đĩa và xử lý nhanh kết quả trong thời gian không có ý nghĩa. Ngược lại, trang web trực tiếp của tôi có hơn 1000 bài đăng và php mất theo thứ tự 50ms để truy xuất các bài đăng của trang nhất. Để đặt điều này trong phối cảnh, trang web dev của tôi đã kéo 10 hàng đầu trong số vài trăm nghìn trong 20ms ...
Denis de Bernardy

Re các chỉ mục hiện tại của bạn: type_status_date rộng đến mức MySQL thường thích sử dụng post_status hoặc post_date. post_status_date_gmt / post_date_gmt được sử dụng nội bộ cho các truy vấn rất cụ thể. Thường là người đầu tiên trong kinh nghiệm của tôi. post_parent / post_name được sử dụng khi truy vấn các loại phân cấp; đầu tiên sẽ được hưởng lợi từ việc post_type được thêm vào đó để lấy lại các trang gốc một cách nhanh chóng. post_ Tác giả hữu ích cho các trang tác giả và trong khu vực quản trị. Đối với các trang tác giả của giao diện người dùng, điều này sẽ lý tưởng hơn: (post_ Tác giả, post_type, post_status, post_date DESC).
Denis de Bernardy

Tiếp tục ... term_tax (object_id, term_taxonomy_id) là tốt để có được thẻ / mèo / vv từ bài viết. Tôi đã kiểm tra lần cuối, không có chỉ mục nào khác về các điều khoản được sử dụng. Extra_term_tax được đề cập ở trên của tôi cho phép thực sự có được các điều khoản bằng cách sử dụng một chỉ mục và Extra_term_rel sẽ cho phép tìm nạp các bài đăng phù hợp với một thuật ngữ.
Denis de Bernardy

@Denis - câu trả lời tuyệt vời ở đây ... Tôi chỉ muốn hỏi bạn rằng giải pháp đề xuất cho vấn đề của anh ấy có phải là thứ bạn thực hiện trên các trang web wordpress của bạn theo mặc định không?
NetConstructor.com

5

Theo mặc định, không có sự khác biệt nào đối với hiệu suất của trang chủ. Tuy nhiên, có khả năng một số plugin làm điều gì đó chậm trên trang đó.

Có rất nhiều plugin để cấu hình hiệu năng WP. Tôi thường sử dụng WP Tuner nhưng dường như nó đã bị hỏng cho phiên bản WP mới nhất, vì vậy tôi không có sự thay thế ngay lập tức để đề xuất.

Cách đơn giản nhất là đóng gói mẫu đầy đủ các dấu thời gian / bộ nhớ.

printf(  '%d queries in %.3f seconds, using %.2fMB memory', get_num_queries(), timer_stop( 0, 3 ), memory_get_peak_usage() / 1024 / 1024 );

Đó là thô nhưng thường cho phép xác định vị trí nơi xảy ra chậm.


Rarst là đúng. Bạn có thể có một plugin hoặc tiện ích chỉ chạy trên trang chủ và đang thực hiện các truy vấn dài về một cái gì đó (như có thể kiểm tra danh mục hoặc thứ gì đó?)
jerclarke

@Jeremy: nhưng điều đó không giải thích tại sao một bản sao chính xác của ngôi nhà tải nhanh hơn dưới tên trang khác.
Matteo Riva

@Rarst: cảm ơn vì lời đề nghị nhưng tôi dường như không thể làm cho nó hoạt động tốt. Tôi thấy báo cáo trên trang quản trị nhưng không có gì trên báo cáo thường xuyên. Có thể phụ thuộc vào thực tế là wordpress được bắc cầu bằng vbulletin và plugin không nhận ra tôi là quản trị viên đã đăng nhập
Matteo Riva

1
Nó có thể là mã chính xác của mã trang nhưng nó không phải là bản sao chính xác của môi trường. Thẻ có điều kiện là kỹ thuật mã WordPress rất cơ bản - trang chủ và trang thông thường có thể giống hệt nhau về mã, nhưng thẻ có điều kiện sẽ trả về các giá trị khác nhau và do đó mã khác nhau có thể bắn vào móc. | Không hoạt động - ý bạn là plugin hoặc đoạn trích?
Hết

2
Kemp: Hãy thử vô hiệu hóa tất cả các plugin của bạn và xem sự khác biệt vẫn còn đó. Nếu nó biến mất cho phép họ từng cái một. Một cách khác để kiểm tra điều này sẽ là cài đặt một trang web hoàn toàn mới không có plugin và chạy chủ đề của bạn trên đó, xem trang chủ có còn lâu hơn không.
jerclarke

3

Sau gần 4 năm tôi đã nhận lại được điều này và cuối cùng đã tìm ra vấn đề. Hóa ra trang web có rất nhiều bài viết TẤT CẢ được đánh dấu là dính. Do cách sử dụng wordpress ngớ ngẩn đến khó tin để đánh dấu các bài đăng dính (một mảng được tuần tự hóa trong wp_options), vòng lặp chính của trang chủ động mất một thời gian dài vô cùng. Xóa sticky_poststrường trong bảng đã khắc phục sự cố.


0

Nếu trang chủ mất nhiều thời gian để tải, rất có thể bạn có một plugin hoặc một chức năng trong chủ đề đang thực hiện một yêu cầu từ xa một thời gian khi trang chủ được hiển thị.

Tôi sẽ thực hiện tìm kiếm đệ quy thông qua thư mục wp-content của bạn để gọi các 'wp_remote_' để tìm bất kỳ chức năng nào có thể gây ra điều này.


Nó phải là một cái gì đó mà wordpress làm trước khi tải mẫu, bởi vì nó không phải do mã của trang.
Matteo Riva

2
Mã có thể không có trên chính trang đó, nhưng các chức năng như wp_head()móc hành động cuộc gọi mà trình cắm có thể sử dụng để gọi chức năng phụ. Đó là lý do tại sao @prettyboymp đề xuất tìm kiếm trong toàn bộ wp-contentthư mục và tại sao @Jeremy Clarke khuyên bạn nên vô hiệu hóa tất cả các trình cắm ở trên.
EAMann

Có nhưng cùng một trang chính xác hoạt động tốt được gọi là "tĩnh", nó chỉ bị treo khi được gọi là "động".
Matteo Riva

0

Đầu tiên, hãy kiểm tra quereis của WOrdPress và các hình ảnh, tập lệnh và biểu định kiểu được bao gồm. Bạn có thể kiểm tra các truy vấn với các Truy vấn gỡ lỗi của plugin và bạn sẽ có thêm thông tin về cài đặt của mình và các lỗi với các Đối tượng gỡ lỗi của plugin .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.