MySQL-解决在一个百万级数据库中读取数据效率问题?
在一个百万级的数据表中,有个表的 status
字段 以0 和 1 区分,另一个字段 type
也是 0 和 1 代表问题和答案,且这两个字段做了多列索引做以下查询
SELECT * FROM data
where type = 0 and status=1 limit 1
效率极低,直接导致数据库没响应!
不知这个数据库要怎么设计,怎么查询才能提高效率!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
这两个字段建立索引没什么用,反而占资源。
可以考虑拆表。
并不是所有索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL查询可能不会去利用索引,如一表中有字段sex,male、female几乎各一半,那么即使在sex上建了索引也对查询效率起不了作用。
select * from data inner join(select id from select_table where type = 0 and status=1 limit 100,1) using(id),id表示主键,select_table查询的辅助表,在考虑limit时不需要扫描全表,这样效果好点,不过100万数据取后面的效果估计还是不好的,我觉得更应该考虑查找数据的需求是什么,根据需要选择好的设计方法
不要在status 和type做索引,达不到你的目的.查询结果集不要太大.你的是结果集太大.
数据的变化不超过10个不建议建立索引,因为索引本身也会耗费资源。查询数据的时候尽量不要select * 你需要什么值就取什么值。
你的表中是不是有text或是blob的字段。返回值很大会造成读取慢。
赞同这个说法, 我也遇到过这样的问题。 所做的就是把大字段拆为附属表。
你查一张百万级数据的表,过滤条件只这两个,取出来要做什么用,这两个字段基本是都是bit型的,加多列索引查也不会有什么大的效果,如果取这些数据的结果集做其他数据集的子集,建议将该表与其他表联接取相应的列。如果不做联查,可以只取表中关键的列,放到临时表中,做结果集。取时 表名后加上with (nolock) 选项。
只有两个值的索引没必要建,建好也是效率没很大提升,要不把表按status和type分表