回答

收藏

MySQL索引配置

技术问答 技术问答 202 人阅读 | 0 人回复 | 2023-09-14

我上有4500万行新闻。表架构如下:
5 ]1 ~3 f( [' ?+ ?6 C( OCREATE TABLE IF NOT EXISTS `news` (  `id` int(11) NOT NULL auto_increment, `cat_id` int(11) NOT NULL, `title` tinytext NOT NULL, `content` text NOT NULL, `date` int(11) NOT NULL, `readcount` int(11) NOT NULL default '0', PRIMARY KEY  (`id`), KEY `cat_id` (`cat_id`), KEY `cat_id_2` (`cat_id`,`id`), KEY `cat_id_date` (`cat_id`,`date`)) ENGINE=MyISAM  DEFAULT CHARSET=latin5 AUTO_INCREMENT=462679 ;如下所示,示sql命令获取类别页面的页面 x一些消息,如果x超过100秒需要15秒以上:1 |5 y4 }( Z, N3 t  y
select * news where cat_id='4' order by id desc limit 150000,10;说明显示其使用 where和索引 cat_id_2”; \- @: F/ T) x9 [
在写这个问题的时候,我也检查了一个更简单的问题sql查询也花了将近一分钟:+ U; F/ ?1 q/ M1 z# c
select * from haberler order by id desc limit 40000,10;如果sql类似于以下内容,只需几毫秒:
: {1 _) x2 [7 `% m# p. @4 l* _' @9 `select * from haberler order by id desc limit 20,10;我的my.cnf配置如下:
6 ]& M9 }- [7 H. h8 H4 b' D$ Nskip-lockingskip-innodbquery_cache_limit=1Mquery_cache_size=256Mquery_cache_type=1max_connections=30interactive_timeout=600000#wait_timeout=5#connect_timeout=5thread_cache_size=384key_buffer=256Mjoin_buffer=4Mmax_allowed_packet=16Mtable_cache=1024record_buffer=1Msort_buffer_size=64Mread_buffer_size=16Mmax_connect_errors=10# Try number of CPU's*2 for thread_concurrencythread_concurrency=2myisam_sort_buffer_size=128Mlong_query_time         = 1log_slow_queries        = /var/log/mysql/mysql-slow.logmax_heap_table_size=512M该网站运行在2GB RAM的core2duo上去。我认为问题可能是由于sort_buffer_size但我不确定。提前感谢。; e0 m7 }6 z7 d' j& b: e2 M+ P* L
                                                                " b$ f% K$ k8 @
    解决方案:                                                               
# v( S" C6 v' X' m4 t& }" d                                                                更新:
) `. h4 n/ l7 }' r5 Q" ?0 A请参阅我的博客中的这篇文章,以便更详细地分析问题:6 B) X9 |+ k- I3 d7 |, X
MySQL ORDER BY / LIMIT性能:晚行搜索当您发送类似内容时LIMIT 1.5万,10意味着MySQL记录这些150000,并查找下一个10。& X7 a1 \+ l3 }6 Z1 h
中遍历索引非常慢MySQL。0 h8 q9 r/ C8 R2 Y, E6 h
同样,MySQL以后不能搜索。! W' b: Q5 u' N! c) h! ]* n. g
理论上,如果你这样做的话ORDER BY id LIMIT 1万,10,足以用索引找到1万到1万的价值观,然后看到只有10满足该指数并返回它们。
& M" n9 g3 z" h& z# o除主要值外MySQL,所有主要系统都会意识到这一点,只有在确实需要返回值时才能向上搜索。
/ ^( U( x8 f4 V; Z! d& EMySQL,但是,每行都要找一次。
7 g4 _! o, a+ D6 I4 K# L: V试着这样重写查询:
' w. E& b# L9 G9 wSELECT  news.*FROM    (            SELECT  id        FROM    news        WHERE   cat_id=  ORDER BY                id DESC        LIMIT            oJOIN    newsON      news.id = o.id
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则