请问大家:MySQL查询时只会使用一个索引吗?就是说无论你建了几个索引,mysql系统只会选择一个来使用吗?当数据量上千万甚至过亿时,类似下面的查询要建立怎样的索引才好呢?select count(DISTINCT 统计ip) from 统计表 where 软件编号=1 and 软件版本=1 and 渠道编号=1 and 软件行为=start and date(统计时间)=date("Y-m-d") 或 select count(DISTINCT 客户端特征编码) from 统计表 where 软件编号=1 and 软件版本=1 and 渠道编号=1 and 软件行为=start and date(统计时间)=date("Y-m-d") 多谢!

解决方案 »

  1.   

    where后面的所有字段都加索引
      

  2.   

    是的。1) 使用分区表
    2)  创建索引 create index axx on 统计表(统计时间,软件编号,软件版本,渠道编号,软件行为)
      

  3.   

    另外我还想问一个问题,就是我在一个点连续给一个表插入数据,假如每秒能够插入5000条左右,请问假如插入换成了全国各地分散的点,那么恐怕一秒钟无法再承载5000条插入?
    那么请问怎么样提高各地分散的点的插入效率,比如是否需要建立所谓的连接线程缓存(Thread_Cache池)?会不会有效果?再比如是否需要缓存表的句柄?这样每个插入的用户就不用重复打开表了?另外就是在插入的时候,系统是否会自动写日志,那么如果将日志停掉,是否也能够提高一些效率?
    多谢指点~
      

  4.   

    如果数据非常多非常多,看来使用分区表是需要的,但查询很重要,分区表查询起来会不会比较慢?另外,上面所说“创建索引 create index axx on 统计表(统计时间,软件编号,软件版本,渠道编号,软件行为)”,这是创建的组合索引吧?
    是不是说只需创建一个组合索引就够了?不用创建单列索引了?
      

  5.   

    也可以  你可以通过调用存储过程来保证程序不用更改  或者直接在程序逻辑里面改好   拼一个带日期的sql发送给数据库
      

  6.   

    分表是不是不如对表进行分区来的更好呢?我看了一下这个文章:《通过分区(Partition)提升MySQL性能》http://fanqiang.chinaunix.net/db/mysql/2006-05-08/4135.shtml,可以看到效率也是大幅度提升。请问是不是这样也可以?
      

  7.   

    不好意思,我还没有搞懂你说的分区表究竟是分区还是分表,我现在了解到它们是不同的。
    我在网上看到一句话:“如果单机的cpu能够承受站点的并发数,应该选择分表的方式,因为分表相对简单,容易实现scale,而且涉及到多表连接时,分区是不能直接使用join的。但如果站点并发数太大,需要多个cpu来访问多个数据库是无疑的,这时需要选择分区的方式。”如果是这样的话,我想我们前期只使用一台服务器就应该能够承受并发,这样看来,分表将是更好的选择。
      

  8.   

    分区是指将数据量比较大表按照list、range等方式进行分区。每一条符合分区条件的数据将按照分区条件存储在相应的分区中。但是大表分区不一定能解决所有问题。查询速度的快慢关系到的因素较多:数据量、并发的DML、索引类型、SQL语句是否足够优化。但有一点,索引多了并不一定就能解决查询问题,要根据sql中的where字句来决定索引的创建方式和索引类型,以及创建索引的字段。
      

  9.   

    你比我还强,我就几百万条数据,免费版的MYSQL还可以勉强凑活。不过最近我也一直在研究MYSQL的进一步优化方法的相关文章。几十亿条数据的话,劝你不要用一个表,另外还需结合orancle, Sphinx 或者 Solr 等第三方引擎辅佐。他们的索引比纯MYSQL的索引要快几十上百倍。或者还可以看看 MongoDB。
      

  10.   

    mysql一个子查询只能用一个索引
    如果要大数据量可以使用第三方索引工具,楼上说过了