怎么从数据库中的一亿条数据中读取我想要的十条数据?

写查询的sql语句,要在查询关键字上建立索引,这样可以加快速度。
例如:select 字段1,字段2,… from 表 where 条件1= aa and 条件2 = bb
1、应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
2、对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
3、应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num is null
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
select id from t where num=0
4、尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num=10 or num=20
可以这样查询:
select id from t where num=10
union all
select id from t where num=20
5、下面的查询也将导致全表扫描:(不能前置百分号)
select id from t where name like ‘�c%’
若要提高效率,可以考虑全文检索。
6、in 和 not in 也要慎用,否则会导致全表扫描,如:
select id from t where num in(1,2,3)
对于连续的数值,能用 between 就不要用 in 了:
select id from t where num between 1 and 3
7、如果在 where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然 而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:
select id from t where num=@num
可以改为强制查询使用索引:
select id from t with(index(索引名)) where num=@num
8、应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:
select id from t where num/2=100
应改为:
select id from t where num=100*2
9、应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:
select id from t where substring(name,1,3)=’abc’–name以abc开头的id
select id from t where datediff(day,createdate,’2005-11-30′)=0–’2005-11-30′生成的id
应改为:
select id from t where name like ‘abc%’
select id from t where createdate>=’2005-11-30′ and createdate<’2005-12-1′
10、不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。

什么是数据库索引
大家平时在开发过程中都避免不了使用数据库索引,那么你了解数据库索引么,接下来呢,我就简单讲一下什么是数据库索引。

一、数据索引是干什么用的呢?

数据库索引其实就是为了使查询数据效率快。

二、数据库索引有哪些呢?

聚集索引(主键索引):在数据库里面,所有行数都会按照主键索引进行排序。
非聚集索引:就是给普通字段加上索引。
联合索引:就是好几个字段组成的索引,称为联合索引。
1
key ‘idx_age_name_sex’ (‘age’,‘name’,‘sex’)
联合索引遵从最左前缀原则,什么意思呢,就比如说一张学生表里面的联合索引如上面所示,那么下面A,B,C,D,E,F哪个会走索引呢?

1
2
3
4
A:select * from student where age = 16 and name = ‘小张’
B:select * from student where name = ‘小张’ and sex = ‘男’
C:select * from student where name = ‘小张’ and sex = ‘男’ and age = 18
D:select * from student where age > 20 and name = '小张’
E:select * from student where age != 15 and name = '小张’
F:select * from student where age = 15 and name != ‘小张’
A遵从最左匹配原则,age是在最左边,所以A走索引;

B直接从name开始,没有遵从最左匹配原则,所以不走索引;

C虽然从name开始,但是有索引最左边的age,mysql内部会自动转成where age = ‘18’ and name = ‘小张’ and sex = ‘男’ 这种,所以还是遵从最左匹配原则;

D这个是因为age>20是范围,范围字段会结束索引对范围后面索引字段的使用,所以只有走了age这个索引;

E这个虽然遵循最左匹配原则,但是不走索引,因为!= 不走索引;

F这个只走age索引,不走name索引,原因如上;

三、有哪些列子不走索引呢?

表student中两个字段age,name加了索引

1
2
key ‘idx_age’ (‘age’),
key ‘idx_name’ (‘name’)
1.Like这种就是%在前面的不走索引,在后面的走索引

1
2
A:select * from student where ‘name’ like ‘王%’
B:select * from student where ‘name’ like ‘%小’
A走索引,B不走索引

2.用索引列进行计算的,不走索引

1
2
A:select * from student where age = 10+8
B:select * from student where age + 8 = 18
A走索引,B不走索引

3.对索引列用函数了,不走索引

1
2
A:select * from student where concat(‘name’,‘哈’) =‘王哈哈’;
B:select * from student where name = concat(‘王哈’,‘哈’);
A不走索引,B走索引

  1. 索引列用了!= 不走索引,如下:

1
select * from student where age != 18
四、为什么索引用B+树?

这个可以参考什么是B+树

五、索引在磁盘上的存储?

聚集索引和非聚集索引存储的不相同,那么来说下都是怎么存储的?

有一张学生表

复制代码
create table student (
id int(11) not null auto_increment comment ‘主键id’,
name varchar(50) not null default ‘’ comment ‘学生姓名’,
age int(11) not null default 0 comment ‘学生年龄’,
primary key (id),
key idx_age (age),
key idx_name (name)
) ENGINE=InnoDB default charset=utf8 comment =‘学生信息’;

复制代码
表中内容如下

id 为主键索引,name和age为非聚集索引

1.聚集索引在磁盘中的存储

聚集索引叶子结点存储是表里面的所有行数据;

每个数据页在不同的磁盘上面;

如果要查找id=5的数据,那么先把磁盘0读入内存,然后用二分法查找id=5的数在3和6之间,然后通过指针p1查找到磁盘2的地址,然后将磁盘2读入内存中,用二分查找方式查找到id=5的数据。

2.非聚集索引在磁盘中的存储

叶子结点存储的是聚集索引键,而不存储表里面所有的行数据,所以在查找的时候,只能查找到聚集索引键,再通过聚集索引去表里面查找到数据。

如果要查找到name = 小徐,首先将磁盘0加载到内存中,然后用二分查找的方法查到在指针p1所指的地址上,然后通过指针p1所指的地址可知道在磁盘2上面,然后通过二分查找法得知小徐id=4;

然后在根据id=4将磁盘0加载到内存中,然后通过二分查找的方法查到在指针p1所指的地址上,然后通过指针p1所指的地址可知道在磁盘2上面,然后通过id=4查找出郑正行数据,就查找出name=小徐的数据了。

数据库查数据 索引相关推荐

  1. resultset遍历取数据_数据放在哪?如何从数据库取数据?

    前言 数据放在数据库内(如:mysql) 如何获取数据,可用JDBC 1. 为什么要了解mysql数据库? 因为实际的生活中,网页里面的内容都不是静止的,会根据你的操作和交互,数据会发生变化 有数据变 ...

  2. Android复习07【创建数据库、insert()插入数据、查看数据库、根据列索引获取参数值、根据列名-返回索引、增删改查数据、数据分页、修改表结构、Room框架】

    2020-04-09-星期四-第八周 目   录 创建数据库 insert()方法 查看数据库(Save as保存) 菜鸟教程---SQLite数据库 根据 列索引 获取 参数值 列比较多---根据列 ...

  3. jedis取存 数据库查到的对象_Mysql数据库索引BAT面试必问

    1.你能说说什么是索引吗? 在关系数据库中,索引是一种单独的.物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清 ...

  4. solr 从数据库导入数据,全量索引和增量索引(实例配置原理)

    http://blog.csdn.net/u013378306/article/details/50761610 为防止原文删除特此备份 ------------------------------- ...

  5. solr 从数据库导入数据,全量索引和增量索引

    首先说一下是从MySQL数据库导入数据 这里使用的是mysql测试. 1.先在mysql中建一个表:solr_test 2.插入几条测试数据: 3.用记事本打solrconfig.xml文件,在sol ...

  6. 转:solr 从数据库导入数据,全量索引和增量索引(实例配置原理)

    http://blog.csdn.net/u013378306/article/details/50761610 为防止原文删除特此备份 ------------------------------- ...

  7. SQL Server创建数据库和数据的增删改查

    SQL Server创建数据库和数据的增删改查 本文是针对数据的增删改查,数据的创建 首先我们使用命令创建sql server数据库 D盘新建一个文件夹DB use master go --创建数据库 ...

  8. 代码优化从数据库里查数据

    今天写了几行代码,都是从一个表里查数据.而我却查了三次数据库, 代码例子如下: dalclass.GetLie("userName","Student",&qu ...

  9. 跟益达学Solr5之从MySQL数据库导入数据并索引

    最近有小伙伴跟我抱怨说:益达,最近博客更新的有点慢呐.其实不是我变懒了,我是不想因为数量而降低了博客的质量,我需要抱着对你们负责的态度来写每一篇博客,绝不能含糊啊,所以,还望大家多多包涵呐. 今天群里 ...

最新文章

  1. Ios应用网络安全之https
  2. 边沿检测与信号同步?
  3. python编程基础知识点上的问题_python编程入门之二:必备基础知识
  4. rabbitmq管理界面的使用
  5. 记一次 .NET 某WMS仓储打单系统 内存暴涨分析
  6. 【C++grammar】结构化绑定
  7. (连续子序列)唯一的雪花
  8. 含隐变量模型求解——EM算法
  9. 基于KELI5 新建一个STM32 project流程
  10. 基础搜索(kuangbin专题)
  11. 服装CAD软件测试初学者,CAD服装打版基础教程
  12. python声音报警_python:基于tkinter打造的股票实时监控声音报警器! 自动监控,声音警报...
  13. 回归分析中的多重共线性问题
  14. outlook邮件撤回你了解吗?邮件撤回功能讲解
  15. 字节跳动2019春招算法题
  16. bootstrap简单的页面布局
  17. 损坏的映像 错误0xc0000020
  18. 客制化键盘编程_客制化键盘QMK固件入门-修改keyboard和keymap
  19. 手机怎么访问kodi_干货:如何使用KODI打造属于自己的娱乐媒体内容库?
  20. Windows sqlite3 安装使用+ 1SQLiteDeveloper 可视化查看

热门文章

  1. 升级电脑系统或者重装WIN10后,PADS软件卡死
  2. 什么是SOL注入攻击?Land攻击?Ping of Death攻击?Teardrop攻击?
  3. bootstrap v4 toast轻提示正确用法
  4. Linux 压缩、解压、打包操作
  5. sql字符串和数字转换
  6. fetch_array()与fetch_assoc()的用法
  7. WINDOWS远程连接显示“请稍后”
  8. ST-LINK下载程序出现flash download failed - ‘cortex m4‘
  9. TPC-H系列---2---TPC-H表结构及表之间的关系
  10. 高德打造全民出行节 十一出游“心不堵”