开发者社区 问答 正文

mysql 排序 索引问题报错 

select * from biao 

Where colum1='a' and column2='c' and c=''

order by c3,c5,c_time desc limit 10
c3,和c5 的重复率高 都是0或者1 如何建立索引保证高效, 数据有10w左右 囧 我建立的索引 查询要6s多(512m 内存的虚机上 innodb),但是我把c3,c5从order by中去掉 ,部队他们排序马上就只要几十ms  我的索引是 主键 :一个无意义列                   索引1:  colum1  column2   c                  索引2:c_time 我在想如果只删除索引1,更改索引2为c3 c5 c_time,是否会快点。 或者 主键索引变成 一个无意义列,c3 c5 c_time  不知道是否可行,昨天晚上太晚 没来得及测试,今天只好在这里问大家。 哪样最好,同时为什么?

展开
收起
kun坤 2020-06-03 13:11:58 747 分享 版权
1 条回答
写回答
取消 提交回答
  • colum1  column2   c  c3 c5 c_time 这样应该就行了######索引多了引起的是insert\update慢,以及索引的维护成本、占用存储空间,看需求哦######@mahone : ORDER BY 字段也可走索引。不过mysql的索引及查询优化器功能较差,没什么可折腾的~######这么多字段,会不会索引数据量有点大?性能会不会也不是很好?请教,order by的字段也要建索引是么?######

    引用来自“fzxu_05”的答案

    colum1  column2   c  c3 c5 c_time 这样应该就行了
    好 回家时候试试  ######试完了给了结论,参考学习下...谢谢...###### SELECT `news_id`, `news_title`, `news_keywords`, `news_summary`, `news_imgname`, `news_publishtime`, `news_filepath`, `news_author`, `news_editor`, `news_onTop`, `news_newTop`, `news_CNTop`  FROM `tb_news` a inner join tb_menu b on a.menu_id=b.menu_id  WHERE  `news_isapproval` = '1'  AND b.`menu_fid` = 113 AND `news_imgname` = ''  ORDER BY `news_newTop` desc, `news_CNTop` desc, `news_publishtime` desc LIMIT 10 这样的查询悲剧了 如果把in换成 =110 就很快 不知道怎么优化 ######

    引用来自“十一文”的答案

    SELECT `news_id`, `news_title`, `news_keywords`, `news_summary`, `news_imgname`, `news_publishtime`, `news_filepath`, `news_author`, `news_editor`, `news_onTop`, `news_newTop`, `news_CNTop`  FROM `tb_news` a inner join tb_menu b on a.menu_id=b.menu_id  WHERE  `news_isapproval` = '1'  AND b.`menu_fid` = 113 AND `news_imgname` = ''  ORDER BY `news_newTop` desc, `news_CNTop` desc, `news_publishtime` desc LIMIT 10 这样的查询悲剧了 如果把in换成 =110 就很快 不知道怎么优化
    按照网上的 换成join 也不行 SELECT `news_id`, `news_title`, `news_keywords`, `news_summary`, `news_imgname`, `news_publishtime`, `news_filepath`, `news_author`, `news_editor`, `news_onTop`, `news_newTop`, `news_CNTop`  FROM `tb_news` a inner join tb_menu b on a.menu_id=b.menu_id  WHERE  `news_isapproval` = '1'  AND b.`menu_fid` = 113 AND `news_imgname` = ''    ORDER BY `news_newTop` desc, `news_CNTop` desc, `news_publishtime` desc LIMIT 10   说明 索引现在是 menu_id news_isapproval news_imgname news_newTop news_CNTop news_publishtime ######试试索引。tb_menu(menu_id,menu_fid); tb_news(menu_id,news_isapproval,news_imgname,news_newTop, news_CNTop, news_publishtime)######定 等人回答!######囧 还是没人回答吗?######这个索引基本在两个就可以满足 应该所有的时间花费在排序上 用explain把你的语句分析下看下贴出来 ######的确 是所有时间都花在排序上 但是我不知道怎么办 囧######因为C3,C5重复率极高,那么就不要在上边建索引了,重复率很高的建索引反而不胜全表扫描,C_time,column1,column2,c这些如果重复率不高的话,可以保留索引,另外不要用select *这样的形式
    2020-06-03 14:08:19
    赞同 展开评论