Thank you very much for your replies. I've moved MySQL to another server. Now it's much more faster and it's CPU usage is max 50%.
The problem seems about sorting queries. After replacing ORDER BY news_date to ORDER BY news_id slow queries decreased. As I need to sort queries by date this won't be an absolute solution. I'm still looking for a batter way.
You could check another thing, that query with 25 latest news is te major one, so:
1. fetch 24 latest rows (A)
2. insert new row into news table (B)
3. put A+B into static file
4. show that file to the users
That would give a breath to the mysql.
SELECT news_id,news_title,news_image_small,news_summary FROM news WHERE news_position IN (8,3,7) and news_cat='1' ORDER BYnews_date DESC LIMIT 0, 2;
and avoid the filesort, you should add a index that contains the ORDER BY column.
In this case since you have the "news_position IN (8,3,7)" and that is not a constant value you should place that column last in the index. Even after the ORDER BY column.
ALTER TABLE news ADD INDEX news_ix_cat_date_pos(news_cat, news_date, news_position);
But if your query had been "WHERE a = 1 AND b = 1 ORDER BY c" then the index should be (a,b,c) since the c which is order by is least absolute (if you understand what I mean).
... WHERE DATE(news_date) = CURDATE()
Is bad because it forces an operation on each news_date field of every row.
Since news_date is a datetime it is enough to rewrite it to be:
... WHERE news_date >= CURDATE()
Since CURDATE() will in this case implicitly be be converted to the datetime value '2009-04-15 00:00:00' you will get all of todays records anyway.