Ticket #2604: sql_chat.txt

File sql_chat.txt, 23.8 kB (added by ryan, 3 years ago)

Chat with Domas on #wordpress-dev

Line 
1 (11:48:55) photomatt: okay, going to flood to catch ryan up :)
2 (11:49:03) photomatt: did you guys see the mysql guy in #wordpress last night?
3 (11:49:03) photomatt: [11:32AM] photomatt: he suggested some really interesting improvements
4 (11:49:03) photomatt: [11:32AM] photomatt: in my tests it took the main post query from 0.12 to 0.05
5 (11:49:07) photomatt: [11:32AM] photomatt: on average
6 (11:49:09) photomatt: [11:32AM] photomatt: http://p.defau.lt/?tiJutSuV86iBJfUPGq_h0g
7 (11:49:12) photomatt: [11:33AM] photomatt: http://p.defau.lt/?_hp_YagOMRNnFgeXdhpbpw
8 (11:49:14) photomatt: [11:33AM] photomatt: (the second is 4.1 only though)
9 (11:49:33) photomatt: rboren: if we could eliminate the DISTINCT and GROUP BY from post queries that don't need it
10 (11:49:43) photomatt: and add this suggested index
11 (11:49:53) photomatt: (he also suggested making post_type a shorter varchar, maybe 10-20)
12 (11:50:10) photomatt: well, try out the queries, it helps a lot
13 (11:52:51) domas [n=midom@wikipedia/Midom] entered the room.
14 (11:53:00) domas: hello! can I lurk here? :)
15 (11:53:17) photomatt: totally
16 (11:53:43) photomatt: domas is the fellow who suggested the changes I pasted above
17 (11:53:59) domas: did you collect ones that I pasted afterwards in channel?
18 (11:54:16) photomatt: got two from p.defau.lt
19 (11:54:30) rboren: I'm making the following changes:
20 (11:54:31) rboren: http://p.defau.lt/?tiJutSuV86iBJfUPGq_h0g
21 (11:54:47) rboren: And shortening the varchars for post_type and post_status
22 (11:55:06) domas: category query is important too
23 (11:55:14) photomatt: domas: out of curiosity, why is the index in that order?
24 (11:55:24) photomatt: (post_status,post_type,post_date)
25 (11:55:31) domas: photomatt: it could be type,status,date
26 (11:55:39) domas: status,type - for WHERE, date for ORDER BY
27 (11:56:31) domas: maybe you need to add ID there
28 (11:56:44) domas: at the end
29 (11:56:56) domas: (so you could GROUP BY date DESC, ID DESC
30 (11:57:12) domas: of course, if post_date was unique, you could just GROUP BY date
31 (11:57:21) domas: but you'd have to code according to that
32 (11:57:23) photomatt: mysql can only use one key per query?
33 (11:57:38) photomatt: post_date might not be unique
34 (11:57:48) domas: then append ID at the end.
35 (11:58:12) domas: photomatt: not really. mysql in 5.0 can do index merge for multiple keys, but it won't compile a composite key out of separate indexes
36 (11:58:19) domas: (and that would be painful operation anyway)
37 (11:58:30) photomatt: k
38 (11:58:56) domas: composite keys are used everywhere
39 (12:00:40) domas: these two queries:
40 (12:00:40) domas:                    66 Query     SELECT * FROM wp_categories WHERE cat_ID > 0 HAVING category_count > 0 ORDER BY cat_name asc
41 (12:00:40) domas:                    66 Query     SELECT * FROM wp_categories WHERE cat_ID > 0 HAVING link_count > 0 ORDER BY cat_name ASC
42 (12:00:55) domas: could possibly be rewritten into link_count>0 or category_count>0
43 (12:01:21) domas: this one:
44 (12:01:22) domas:                    66 Query     SELECT COUNT(DISTINCT ID) FROM wp_posts  WHERE 1=1 AND (post_type = 'post' AND (post_status = 'publish'))
45 (12:01:30) domas: can be eliminated too, of course :)
46 (12:02:09) domas: I didn't look yet at the object cache code
47 (12:02:31) photomatt: for post queries we also sometimes have "(post_author = 1 AND post_status = 'private'"
48 (12:02:38) photomatt: to get private posts for the current logged in user
49 (12:03:02) photomatt: but that might be a rare enough case that it doesn't need to be optimized for
50 (12:03:15) domas: *nod*
51 (12:03:18) domas: I'm looking at anon hits
52 (12:04:21) photomatt: but it might be easier just to create a separate section in the admin for private posts and leave them out of public listings all-together
53 (12:04:27) photomatt: it's a weird feature anyway
54 (12:04:57) domas: 'cron' and 'rewrite_rules' should go into autoload options :)
55 (12:05:22) domas: as for categories, this seems fun:
56 (12:05:23) domas:                    68 Query     SELECT * FROM wp_categories
57 (12:05:23) domas:                    68 Query     SELECT cat_ID FROM wp_categories
58 (12:06:07) domas: btw, for categories, this query is executed twice too:
59 (12:06:08) domas:                    68 Query     SELECT COUNT(DISTINCT ID) FROM wp_posts  LEFT JOIN wp_post2cat ON (wp_posts.ID = wp_post2cat.post_id)  WHERE 1=1 AND (category_id = 4) AND (post_type = 'post' AND (post_status = 'publish'))
60 (12:06:53) domas: it's fast enough and using the (`post_status`,`post_type`,`post_date`,`ID`) index, but still :)
61 (12:08:37) MarkJaquith: photomatt: New wp.org/support/ logins don't seem to be syncing with Trac... you aware?
62 (12:08:47) photomatt: yes
63 (12:09:01) photomatt: haven't been since the server move, I'm going to look at it ina bit
64 (12:09:02) MarkJaquith: Cool.  I figured it had something to do with the server move or something
65 (12:09:21) domas: for rss feeds:
66 (12:09:21) domas:                    70 Query     SELECT post_modified_gmt FROM wp_posts WHERE post_status = 'publish' ORDER BY post_modified_gmt DESC LIMIT 1
67 (12:09:21) domas:                    70 Query     SELECT post_date_gmt FROM wp_posts WHERE post_status = 'publish' ORDER BY post_date_gmt DESC LIMIT 1
68 (12:09:29) domas: both fields have no indexes.
69 (12:10:00) domas: so either these values have to be maintained somewhere else
70 (12:10:23) domas: on the second query you may just use post_date
71 (12:10:31) domas: instead of _gmt, as for ordering value should be the same
72 (12:11:03) MarkJaquith: there is an edge case where they aren't... not sure it matters
73 (12:11:22) domas: well, it's rss feed
74 (12:11:43) domas: on every hit to rss feed you order the column again and again.
75 (12:11:49) domas: it's optimized by mysql though
76 (12:11:57) domas: that is, only one row is used for a sort
77 (12:13:38) domas: woo, article view.
78 (12:14:18) domas: the index I created was used again for several queries
79 (12:15:28) MarkJaquith: what'd you index?
80 (12:15:29) domas: comments:
81 (12:15:51) domas: MarkJaquith: on posts: type,status,date,id
82 (12:16:10) domas: now comments ask for this index: postid,approved,date
83 (12:18:13) mdawaffe is now known as mdawaffe|lunch
84 (12:19:37) domas: with this index comments would not be sorted :)
85 (12:19:46) domas: filesorted, just an index range scan
86 (12:20:17) domas: it picks comments_aproved index
87 (12:20:28) domas: I provided a hint to ignore it
88 (12:21:19) domas: http://p.defau.lt/?DRnl1EN_6SB7UhBfgzLdrw
89 (12:21:56) domas: the /*!4000.. specifies that the ignore index clause should be used on 4.0 or newer
90 (12:22:04) domas: I don't remember if 3.23 actually supported IGNORE INDEX :)
91 (12:22:20) photomatt: wow, you weren't kidding about the mysqlisms ;)
92 (12:22:46) domas: well, /* is official SQL comment
93 (12:22:56) domas: so, on any other platform it would not be executed
94 (12:23:01) domas: oracle uses /*+blahblah
95 (12:23:48) photomatt: got it
96 (12:24:11) domas: anyway, on proper deployments you don't need this hint
97 (12:24:22) domas: it's just my test dataset of single article provides skewed view to optimizer
98 (12:24:37) domas: not much of optimizations can be done with single row, can it? :)
99 (12:25:10) MarkJaquith: heh... at least not any that'll add up to what you can do while optimizing one of the posts/category queries
100 (12:25:41) domas: hehe
101 (12:25:51) rboren: FYI: http://trac.wordpress.org/ticket/2604
102 (12:26:01) domas: well, I did that analysis post on my real dataset
103 (12:26:08) domas: which at least has >20 posts and >20 comments, ha ha ha
104 (12:27:12) BigJibby [n=matt@mtl58-2-131-132.dialup.sprint-canada.net] entered the room.
105 (12:27:17) MarkJaquith: domas: running 1.5.2, right?
106 (12:27:49) domas: MarkJaquith: yessir
107 (12:28:05) MarkJaquith: (just reading your blog post now)
108 (12:28:39) domas: hehe, sorry for sarcasm, it wasn't directed towards any of you, just for general problem of not dealing with performance
109 (12:29:07) domas: I'm doing performance engineering for opensource project, so every time I have to LART people about various issues
110 (12:29:08) MarkJaquith: DISTINCT needs to go away for single-table post queries for sure
111 (12:29:22) domas: MarkJaquith: for multiple-table you'd be better using proper GROUP BY
112 (12:30:13) domas: http://bugs.mysql.com/bug.php?id=18182 <--- this one if fixed would improve your category query performance even more :)
113 (12:30:37) MarkJaquith: "I’d really like if it just used "publish" status for front page and would not care about anything else. "   Good news... that's what's happening for 2.1
114 (12:31:14) domas: hehe, I just looked at our bugs system
115 (12:31:23) domas: I've opened 6 bugs with words 'index' in description :)
116 (12:31:26) domas: *word
117 (12:31:58) MarkJaquith: The hidden benefit there is that you can now cache the queries, because you don't have that dynamic timestamp variable in each query
118 (12:32:13) ***domas enjoys the fading yellow
119 (12:33:24) domas: caching is nice for small sites enjoying lots of reads and no writes
120 (12:33:37) domas: none of sites I work with or clients of mine have such situations :)
121 (12:33:45) photomatt: that's the bulk of WP installations
122 (12:33:58) photomatt: if you think we have perf problems now, you should have seen 0.72
123 (12:34:00) photomatt: :)
124 (12:34:31) rboren: Not many people were around to witness 0.72 perf problems. :-)
125 (12:34:43) photomatt: I remember doing a profile and finding 60% of our time being spent on convert_char or something like that
126 (12:34:44) domas: haha, I'm fascinated enough to remember mediawiki 1.3/1.4 ;-)
127 (12:35:03) photomatt: which was individually looping over EVERY SINGLE CHARACTER in every post
128 (12:35:04) domas: photomatt: well, an example of badly optimized situation was
129 (12:35:23) domas: when for interwiki prefixes, for every link there was a hit to our memcached cluster
130 (12:35:31) ***MarkJaquith is so glad he only got involved with WordPress right before 1.2 release
131 (12:35:34) domas: and it takes ~2ms each
132 (12:36:08) domas: so it used to spend 50ms or more on fetching absolutely static data
133 (12:36:27) domas: and the interesting part, why it was not noticed
134 (12:36:40) domas: it always was hidden beneath other tasks that appeared 'long' in profiling trees
135 (12:36:52) domas: only proper kcachegrind analysis allowed to track such issues
136 (12:37:12) domas: moral of the story: do not assume the task is slow until you know what is slow in it.
137 (12:37:50) ***ringmaster re-reads the story of MediaWiki innards and impales himself on a fork.
138 (12:37:50) photomatt: what's kcachegrind?
139 (12:38:17) domas: ringmaster: which story?
140 (12:38:26) ringmaster: The one you just told.  :)
141 (12:38:51) domas: photomatt: http://dammit.lt/2006/01/18/mediawiki-graphic-profile/
142 (12:39:03) domas: photomatt: one (two actually) pictures are better than thousand words.
143 (12:39:05) MarkJaquith: domas: in 2.x, WP now stores comment_count in the posts table, as you suggested (still reading!)
144 (12:39:16) photomatt: that's purty
145 (12:39:36) domas: photomatt: I was working on cpu profiling instead of real time profiling
146 (12:39:42) domas: but ditched that for a while
147 (12:39:45) domas: may resume the effort some day
148 (12:45:49) domas: hehe, wanna see a pic of wordpress kcachegrind graph? :)
149 (12:46:01) photomatt: sounds perfect, I'll definitely try to make it
150 (12:46:40) ***MarkJaquith puts his money down on smiley regexes
151 (12:46:44) MarkJaquith: (kidding)
152 (12:46:55) domas: haha, someone asked for that
153 (12:46:59) domas: in mediawiki
154 (12:47:41) photomatt: sure
155 (12:48:15) domas: I hate such features :)
156 (12:48:18) domas: pain to maintain
157 (12:48:22) domas: breaks other syntax
158 (12:48:25) domas: performance hog
159 (12:49:07) MarkJaquith: 1) wait 2) wait 3) wait 4) wait 5) wait 6) wait 7) almost there 8) SUNGLASSES!
160 (12:50:09) photomatt: ha!
161 (12:50:15) photomatt: LOL
162 (12:51:38) domas: ;-D
163 (12:52:49) MarkJaquith: error_bot: google wordpress smilies
164 (12:52:52) error_bot: MarkJaquith: Search took 0.17 seconds: WordPress Smilies [ Tempus Fugit | TxFx.net ]: <http://txfx.net/2004/08/18/wordpress-smilies/>; WordPress Smilies: <http://www.tamba2.org.uk/wordpress/smilies/>; Using Smilies « WordPress Codex: <http://codex.wordpress.org/Using_Smilies>
165 (12:53:16) MarkJaquith: (that first result would be mine, domas)
166 (12:55:49) photomatt: domas: would love to see kcachegrind output for WP
167 (12:56:43) domas: photomatt: hehe
168 (12:56:47) domas: --->  Fetching graphviz
169 (12:56:48) domas: --->  Attempting to fetch graphviz-2.6.tar.gz from http://www.graphviz.org/pub/graphviz/ARCHIVE/
170 (12:56:52) domas: forgot to install some deps before
171 (12:56:55) domas: on this machine
172 (12:57:18) domas: well, I don't have enough data
173 (12:57:23) domas: so the results would be... skewed again :)
174 (12:57:33) domas: oh, downloaded
175 (12:57:52) domas: this LCD compiles things really fast :)
176 (13:00:11) photomatt: oh that's right you still need the dump file
177 (13:00:23) photomatt: rboren: do you still have that giant MT dump I sent you? I can't find it
178 (13:00:34) rboren: Lemme look...
179 (13:03:54) rboren: Found it.
180 (13:04:02) rboren: I'll upload it somewhere...
181 (13:05:31) BigJibby left the room (quit: Read error: 104 (Connection reset by peer)).
182 (13:05:41) domas: compress it too, thanks!
183 (13:11:30) domas: damn, it got mad with wp profile
184 (13:12:12) domas: there's some code that is executed directly via require_once() instead of calling as functions
185 (13:12:40) photomatt: ?
186 (13:15:09) domas: well, the most expensive functions are require_once
187 (13:15:12) domas: and require
188 (13:15:35) domas: instead of loading file with functions and calling them, you execute it directly
189 (13:15:49) domas: so there's no difference between actually loading file and executing code
190 (13:15:50) domas: in the profile
191 (13:16:02) masquerade [n=masquera@c-68-49-145-242.hsd1.de.comcast.net] entered the room.
192 (13:16:05) photomatt: huh
193 (13:16:25) photomatt: well because of the amount of code, we've always suspected that the biggest overhead was simply parsing it all
194 (13:16:31) domas: not really
195 (13:16:33) photomatt: which is why an opcode cache helps so much
196 (13:16:53) domas: but yeah, opcode helps
197 (13:17:56) domas: it spent 5% of real time on mysql ;-D
198 (13:18:44) domas: eh, I can't provide you with a nice graph, just several small ones probably
199 (13:19:57) photomatt: too much junk?
200 (13:20:36) domas: ah, or doesn't show too much
201 (13:20:40) domas: it's much better if interactive
202 (13:20:49) domas: for analysis of details
203 (13:21:23) domas: and maybe xdebug acting funny on this box :(
204 (13:21:31) domas: ok, I'll do one export
205 (13:23:27) domas: http://dammit.lt/wordpress-kcg.png
206 (13:24:08) domas: most of code is hidden in require or require_once calls
207 (13:24:10) domas: :(
208 (13:24:57) photomatt: weird
209 (13:25:05) photomatt: I'm not sure what we're doing that would make it appear so weird
210 (13:25:32) masquerade: Anyone have Zend Studio's Debug Server setup? Its profiling might help out in this case
211 (13:25:50) photomatt: lots of time in load_template, it looks like
212 (13:26:09) MarkJaquith: lot of file_exists calls eh?
213 (13:26:44) domas: you should really move away execution from script loading
214 (13:27:03) photomatt: I still don't understand exactly what you mean by that
215 (13:27:09) domas: require();require(); dothis(); dothat();
216 (13:27:21) photomatt: oh I see
217 (13:27:29) photomatt: so the action is happening inside the requires
218 (13:27:34) ringmaster: As opposed to require(<? dothis());require(<? dothat());
219 (13:28:03) domas: well, not really
220 (13:28:11) photomatt: I think he means that a file includes another file which has the executing code in it
221 (13:28:11) domas: the problem is require(code;code;no;functions)
222 (13:28:28) domas: e.g. wp-settings
223 (13:28:28) photomatt: so we don't execute anything inside of index.php, for example
224 (13:28:43) domas: has lots of code but 3 tiny functions
225 (13:29:19) photomatt: nothing executes from wp-includes, I think
226 (13:29:23) photomatt: but other files do
227 (13:29:47) photomatt: I take that back, nothing in functions.php, template* executes any code, just loads it
228 (13:30:13) masquerade: I fail to see how any of that is or could be a performance trap, though
229 (13:30:42) domas: not much of performance trap
230 (13:30:45) MarkJaquith: masquerade: it's just a performance mask... with this tool.
231 (13:30:49) domas: it just obstructs clear view of what is happening where
232 (13:31:20) domas: anyway, branches can still be analyzed
233 (13:31:21) masquerade: try APD
234 (13:31:33) domas: masquerade: it won't give you graphic profile :)
235 (13:31:46) domas: you should _try_ kcachegrind :)
236 (13:31:53) masquerade: I'd rather have the text than that mess any day, for PHP
237 (13:32:49) domas: ah: http://flake.defau.lt/pics/mediawiki.png
238 (13:32:54) domas: this is how it usually outputs stuff
239 (13:33:16) domas: (that picture details the situation I talked about here ;-)
240 (13:33:49) domas: masquerade: the nice thing about that is 'where is this method called, what is called by it, how much time was spent in multiple places, etc'
241 (13:35:34) domas: e.g. this is all database activity profiled: http://dammit.lt/wordpress-kcg-sql.png
242 (13:35:52) domas: (on an empty db though, I'll try importing a dump soon)
243 (13:36:50) MarkJaquith: photomatt: the load_template just does require_once... so that's misleading.
244 (13:37:44) masquerade: I'm spoiled by Zend Studio's profiler
245 (13:37:46) photomatt: yep
246 (13:37:57) photomatt: masquerade: andy has been using that
247 (13:38:19) masquerade: I'd pick it any day over callgrind/kcachegrind style dumps for PHP source
248 (13:38:42) masquerade: (Although I do understand the value of callgrind, its invaluable when working with C)
249 (13:47:34) domas: anyway, I'm not selling anything here, hehehe
250 (13:49:27) domas: ok, with more data
251 (13:49:47) domas: http://p.defau.lt/?GyzOyrdWQ1eScjMefMXOoQ
252 (13:49:55) domas: this may be probably loaded linked to posts read
253 (13:49:57) domas: joined
254 (13:51:59) MarkJaquith: Wait, it did that all in one load?
255 (13:52:19) domas: yes
256 (13:52:27) domas: for anon
257 (13:53:00) MarkJaquith: You have the object cache disabled, or is wp-content not server writable?
258 (13:53:07) masquerade: MarkJaquith, he's on 1.5
259 (13:53:20) masquerade: (or according to the blog post, not 2.0 at least)
260 (13:53:25) domas: masquerade: 2.1-alpha
261 (13:53:25) MarkJaquith: masquerade: wp_usermeta
262 (13:53:38) masquerade: ahh, I walked in halfway through all this, excuse me
263 (13:53:39) domas: MarkJaquith: I guess it's object cache disabled
264 (13:54:00) domas: MarkJaquith: it's "default install"
265 (13:54:02) domas: of 2.1 alpha
266 (13:54:07) domas: and wp-content is writable
267 (13:54:10) domas: ok, I'll enable it
268 (13:54:43) MarkJaquith: domas: ah yeah, it is disabled by default in 2.1
269 (13:55:11) MarkJaquith: so you have posts by each of these authors on the loaded page, right?
270 (13:55:20) domas: yes
271 (13:55:41) ***domas notices cache on filesystem sucks if NFS is used ;-)
272 (13:56:08) MarkJaquith: So it should be grabbing the user IDs from the posts query and doing one query with ID IN (1,2,3,4,5) eh?
273 (13:56:11) domas: but I guess people are already sane at these times
274 (13:56:24) domas: MarkJaquith: you can just join user directly to posts.
275 (13:56:36) domas: SELECT * from wp_posts join wp_users ON (..
276 (13:56:41) domas: well, * is evil
277 (13:56:42) domas: but anyway
278 (13:57:24) MarkJaquith: hm, only problem with that is that multiple post queries would do possibly redundant user joins
279 (13:58:04) domas: that's why you'd avoid multiple post queries :)
280 (13:58:27) MarkJaquith: well yes, not in the default template
281 (13:59:26) domas: on the other hand
282 (13:59:28) domas: it's much cheaper
283 (13:59:45) domas: than having multiple queries, ipc, ..
284 (14:00:14) domas: I voted for GROUP_CONCAT() for categories too, but this bastard is in mysql 4.1 and later only
285 (14:00:14) masquerade: heh, just about every other theme and plugin on the planet uses query_posts() for a second post query, so I'm not really sure avoiding multiple post queries is an option
286 (14:00:30) domas: masquerade: but you should not care about join price in this case.
287 (14:00:34) domas: a join is done on an index
288 (14:00:36) domas: and on hot data
289 (14:00:39) domas: it's _cheap_
290 (14:00:47) domas: whatever people tell to you otherwise, don't listen.
291 (14:01:05) MarkJaquith: heh, I expect you know what you're talking about here
292 (14:01:36) domas: well, when you see a join of 50 tables
293 (14:01:43) domas: then you think about better in-db optimization techniques
294 (14:01:47) domas: rather than splitting it
295 (14:01:51) domas: :)
296 (14:02:30) MarkJaquith: this would be a massive code change.
297 (14:02:30) photomatt: domas: hot data?
298 (14:02:43) domas: photomatt: it's in RAM
299 (14:02:58) domas: photomatt: you've read it miliseconds ago, it's in RAM! :)
300 (14:03:03) domas: ergh, nanoseconds even
301 (14:04:29) domas: heh, kubrick fetches are annoying
302 (14:05:14) domas: http://p.defau.lt/?6kSNMyxeSoWHy6ute45mow
303 (14:05:38) MarkJaquith: domas: I filed a bug for that
304 (14:05:42) photomatt: we don't cache "cache misses"
305 (14:05:50) photomatt: right now
306 (14:06:11) domas: well, my original issue about rss feed inside options table still matters :)
307 (14:06:21) domas: photomatt: it should be autoloaded
308 (14:06:22) MarkJaquith: yeah, why are those autoloaded?
309 (14:06:34) photomatt: the options don't exist
310 (14:06:35) MarkJaquith: domas: er, should be?
311 (14:07:00) domas: ah, right
312 (14:07:05) domas: get it :)
313 (14:07:10) photomatt: the RSS cache in the DB is a poor man's cache, writing to the filesystem is a real pain in the enviroments we run in
314 (14:07:24) domas: photomatt: use other DB for that
315 (14:07:28) domas: pew
316 (14:07:29) domas: table.
317 (14:07:30) photomatt: and loading the remote RSS all the time is not nice and slow
318 (14:07:44) photomatt: why?
319 (14:07:57) photomatt: more data in the options table doesn't slow it down, does it?
320 (14:08:31) domas: well, optimizer sees 70 rows
321 (14:08:40) domas: and notices that most of them are autoloaded
322 (14:08:47) domas: so it doesn't even pick autoload index
323 (14:09:02) domas: but there's _one_ row that weights 100x more than all other rows combined
324 (14:09:23) domas: of course, it's negligible data amount ;-)
325 (14:09:25) MarkJaquith: there will still be autoload = no rows even if RSS cache was moved
326 (14:09:37) domas: MarkJaquith: those would not weight 100k
327 (14:09:57) MarkJaquith: hrm, so it's the size of it that matters?
328 (14:09:58) domas: I'm a bit anal here about that, maybe I shouldn't stress it too much
329 (14:10:17) domas: I usually explain this situation as 'the elephant among the ants'
330 (14:10:50) domas: you just can't apply neither elephant rules to all environment, nor ant rules
331 (14:10:51) MarkJaquith: Heh.  Well, I'll say this... SELECT * FROM wp_options; is hell from the command line because of those feeds ;-)
332 (14:11:02) domas: MarkJaquith: too.
333 (14:11:03) masquerade: just wait until you see the amount of data plugins could and do store ;-)
334 (14:11:13) domas: haha, lol
335 (14:11:14) domas: screw plugins
336 (14:11:47) mdawaffe|lunch is now known as mdawaffe
337 (14:11:57) domas: soo...
338 (14:11:57) domas: SELECT DISTINCT YEAR(post_date) AS `year`, MONTH(post_date) AS `month`, count(ID) as posts FROM wp_posts WHERE post_type = 'post' AND post_status = 'publish' GROUP BY YEAR(post_date), MONTH(post_date) ORDER BY post_date DESC
339 (14:11:59) domas: this one
340 (14:12:00) mdawaffe: MarkJaquith: did you get a chance to look at 2561?
341 (14:12:02) domas: is the one I hate most actually
342 (14:12:06) MarkJaquith: mdawaffe: not yet
343 (14:12:11) mdawaffe: no worries
344 (14:12:11) photomatt: haha me too
345 (14:12:45) domas: use per-month cache in a table. :)
346 (14:13:04) domas: publish an article - increase. delete an article - decrease. \o/
347 (14:15:00) domas: oh wait, query cache :)
348 (14:16:00) MarkJaquith: Here's that non-existent option bug report: http://trac.wordpress.org/ticket/2268
349 (14:16:18) domas: as the timestamp is not put into queries, it's much more efficient with query cache of course ;-)
350 (14:16:32) domas: hehe, wanna add one more mysqlism? :)
351 (14:17:01) ringmaster left the room (quit: "Find me at http://asymptomatic.net, where I remain ambivalent.").
352 (14:17:11) MarkJaquith: go for it
353 (14:17:16) domas: SELECT /*! 40000 SQL_CACHE */  ...
354 (14:17:17) domas: ;-)
355 (14:17:29) domas: for queries you really want to cache.
356 (14:18:04) domas: there's a setting for mysqld, which caches only queries with such tags.
357 (14:18:34) domas: so, it'd cache in such cases :)
358 (14:20:36) MarkJaquith: Would require people to have an appropriate setup though
359 (14:20:41) domas: yes
360 (14:21:03) domas: minor issue anyway :)