数据库性能优化之索引
来源:互联网 发布:苹果儿童编程软件 编辑:程序博客网 时间:2024/05/22 06:11
什么是索引
简单来说,索引会对表中一列或者多列的值进行排序,使用索引能快速地查找出某列或某几列中特定值的记录。不使用索引,MySQL默认从第一条记录开始逐条读表,当数据量比较庞大时花的时间就会变长。但,为查询的列加上索引,MySQL能快速地定位一个位置去读取数据,而不是从第一条记录开始逐条读表。
表结构如下:
DROP TABLE IF EXISTS `tbl_order_tax`;
CREATE TABLE `tbl_order_tax` (
`order_tax_id` varchar(60) NOT NULL COMMENT '车船税id',
`order_id` varchar(60) DEFAULT NULL COMMENT '订单唯一号',
`customername` varchar(300) DEFAULT NULL COMMENT '客户名称',
`customertype` varchar(60) DEFAULT NULL COMMENT '客户类型',
`certificatetype` varchar(60) DEFAULT NULL COMMENT '证件类型',
`certificatecode` varchar(60) DEFAULT NULL COMMENT '证件号码',
`taxpayerid` varchar(60) DEFAULT NULL COMMENT '纳税人识别号',
`telno` varchar(60) DEFAULT NULL COMMENT '联系电话',
`address` varchar(300) DEFAULT NULL COMMENT '联系地址',
`zipcode` varchar(60) DEFAULT NULL COMMENT '邮编',
`nationality` varchar(60) DEFAULT NULL COMMENT '国籍',
`homeaddress` varchar(300) DEFAULT NULL COMMENT '居住地址',
`pccode` varchar(60) DEFAULT NULL COMMENT '微机代码',
`ussage` varchar(60) DEFAULT NULL COMMENT '车辆使用性质',
`vehicletype` varchar(60) DEFAULT NULL COMMENT '车辆类型',
`taxvehicletype` varchar(60) DEFAULT NULL COMMENT '车辆类型-税务',
`licencetype` varchar(60) DEFAULT NULL COMMENT '牌照类型',
`licencecolor` varchar(60) DEFAULT NULL COMMENT '车牌颜色',
`licenceno` varchar(60) DEFAULT NULL COMMENT '牌照号码',
`licencedate` date DEFAULT NULL COMMENT '行驶证领证日期',
`oldlicenceno` varchar(60) DEFAULT NULL COMMENT '旧牌照号码',
`engineno` varchar(60) DEFAULT NULL COMMENT '发动机号',
`frameno` varchar(60) DEFAULT NULL COMMENT '车架号',
`enginecapacity` decimal(16,0) DEFAULT NULL COMMENT '排量',
`seatcount` int(10) DEFAULT NULL COMMENT '乘人汽车座次',
`emptyweight` decimal(16,0) DEFAULT NULL COMMENT '整备质量',
`carryingcapacity` decimal(16,0) DEFAULT NULL COMMENT '核定载质量',
`totalweight` decimal(16,0) DEFAULT NULL COMMENT '总质量(公斤)',
`registdate` datetime DEFAULT NULL COMMENT '车辆登记日期',
`settledaddress` varchar(300) DEFAULT NULL COMMENT '车辆落户地址',
`changenativedate` datetime DEFAULT NULL COMMENT '转籍日期',
`policyno` varchar(60) DEFAULT NULL COMMENT '保单号',
`endorsementno` varchar(60) DEFAULT NULL COMMENT '批单号',
`policystartdate` datetime DEFAULT NULL COMMENT '交强险起始日期',
`policyenddate` datetime DEFAULT NULL COMMENT '交强险截至日期',
`taxtype` varchar(60) DEFAULT NULL COMMENT '缴税状态',
`exemptionno` varchar(60) DEFAULT NULL COMMENT '完税凭证号',
`taxtickettype` varchar(60) DEFAULT NULL COMMENT '税票类型',
`taxticketno` varchar(60) DEFAULT NULL COMMENT '税票号码',
`amount` double(16,2) DEFAULT NULL COMMENT '当年应缴',
`backamount` double(16,2) DEFAULT NULL COMMENT '往年补缴',
`latefee` double(16,2) DEFAULT NULL COMMENT '滞纳金',
`derateamount` double(16,2) DEFAULT NULL COMMENT '减免税额',
`totalamount` double(16,2) DEFAULT NULL COMMENT '总计金额',
`derateno` varchar(60) DEFAULT NULL COMMENT '减免税证明号',
`taxbureau` varchar(60) DEFAULT NULL COMMENT '减免税证明开具税务机关',
`backstartdate` datetime DEFAULT NULL COMMENT '往年补缴起始日期',
`backenddate` datetime DEFAULT NULL COMMENT '往年补缴截至日期',
`latefeestartdate` datetime DEFAULT NULL COMMENT '滞纳金起始日期',
`latefeeenddate` datetime DEFAULT NULL COMMENT '滞纳金截至日期',
`taxstartdate` datetime DEFAULT NULL COMMENT '车船税起始日期',
`taxenddate` datetime DEFAULT NULL COMMENT '车船税截至日期',
`taxterm` varchar(60) DEFAULT NULL COMMENT '税款所属期',
`remark` varchar(60) DEFAULT NULL COMMENT '备注',
`balanceamount` double(16,2) DEFAULT NULL COMMENT '补差金额',
`carryingcapacitytmp` int(60) DEFAULT NULL COMMENT '临时字段',
`emptyweighttmp` int(60) DEFAULT NULL COMMENT '临时字段',
`totalweighttmp` int(60) DEFAULT NULL COMMENT '临时字段',
`taxdescription` varchar(60) DEFAULT NULL COMMENT '附加信息',
`taxbureauname` varchar(300) DEFAULT NULL COMMENT '完税开具税务机关名称',
`vehiclestyle` varchar(60) DEFAULT NULL COMMENT '交管车辆类型代码',
`taxchangereasoncode` varchar(60) DEFAULT NULL COMMENT '车船税与询价不同的原因代码',
`taxchangerensondesc` varchar(300) DEFAULT NULL COMMENT '船税与询价不同的原因描述',
`taxamendpremium` decimal(16,2) DEFAULT NULL COMMENT '批改车船税合计',
`taxactualamendpremium` decimal(16,2) DEFAULT NULL COMMENT '车船税实际退补费',
`taxcancelpremium` decimal(16,2) DEFAULT NULL COMMENT '退车船税合计',
`taxactualcancelpremium` decimal(16,2) DEFAULT NULL COMMENT '车船税实际退税金额',
`amountchange` decimal(16,2) DEFAULT NULL COMMENT '当年应缴改变值',
`backamountchange` decimal(16,2) DEFAULT NULL COMMENT '往年补缴改变值',
`latefeechange` decimal(16,2) DEFAULT NULL COMMENT '滞纳金改变值',
`totalamountchange` decimal(16,2) DEFAULT NULL COMMENT '总金额改变值',
`registrynumber` varchar(60) DEFAULT NULL COMMENT '税务登记号',
`startdate` datetime DEFAULT NULL COMMENT '起保时间',
`effectdate` datetime DEFAULT NULL COMMENT '批单生效时间',
`confirmsequenceno` varchar(60) DEFAULT NULL COMMENT '投保确认号',
`amendconfirmno` varchar(60) DEFAULT NULL COMMENT '批改确认号',
`declaredate` datetime DEFAULT NULL COMMENT '申报日期',
`deductionduecode` varchar(60) DEFAULT NULL COMMENT '减免税原因代码',
`deductionduetype` varchar(60) DEFAULT NULL COMMENT '减免税方案代码',
`deductiondueproportion` decimal(16,0) DEFAULT NULL COMMENT '减免比例',
`unitrate` decimal(16,0) DEFAULT NULL COMMENT '单位税额',
`taxunittypecode` decimal(16,0) DEFAULT NULL COMMENT '课税数量',
`createDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updateDate` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
当不建索引的情况下,执行查询语句SELECT * FROM tbl_order_traffic where order_id = '1002016051100000000002101'; 耗时295ms
添加索引后执行 EXPLAINSELECT * FROM tbl_order_traffic where order_id = '1002016051100000000002101'; 耗时如下图
显然查询时间提高了7倍之多。
在性能分析时使用EXPLAIN语句可以分析select的查询过程 。
select_type=SIMPLE表示单表查询;
type=cons表示通过索引一次就找到了相关记录,type=all表示全表扫描;
key=primary,idx_ordertax_orderid表示使用了主键和idx_ordertax_orderid索引。
什么情况下使用索引
索引一般使用在表中存在大量数据,但要查询的数据在表中分布较少。比如说性别就没必要建索引,因为性别只有两个取值男和女(数据重复量比较大)。
不适合建索引的情况
在索引列上使用MySQL函数也会导致索引失效一般范围查询、模糊查询和JOIN查询都不使用索引。索引列上使用函数会导致索引失效。
1 0
- 数据库性能优化之索引
- MySQL 数据库性能优化之索引优化
- MySQL 数据库性能优化之索引优化
- MySQL 数据库性能优化之索引优化
- MySQL数据库性能优化之索引优化
- MySQL 数据库性能优化之索引优化
- MySQL 数据库性能优化之索引优化
- MySQL 数据库性能优化之索引优化
- MySQL 数据库性能优化之索引优化
- MySQL 数据库性能优化之索引优化
- MySQL 数据库性能优化之索引优化
- 数据库性能优化:数据库表优化之SQL索引
- MySQL 数据库性能优化之(三)索引优化
- 【Day61】MySQL数据库性能优化之三(索引优化)
- MYSQL性能优化之Mysql数据库索引优化
- 数据库性能优化方案---索引
- 数据库性能之索引
- SQL Server数据库性能优化之索引篇
- 数据结构与算法--队列
- 第4.1.3章 WEB系统最佳实践页面实例 表格编辑
- 运算符
- angular form表单错误提示并自动focus第一个input
- log4j myBatis 的sql输出配置
- 数据库性能优化之索引
- 为什么要从事BPM开发
- 拦截器,过滤器
- 【JAVA】JAVA 第16周练习题
- js学习笔记-变量作用域
- Qt5.6连接MySQL5.7出错
- 16.7 Swift基于多层链接的可选链
- Android状态栏沉浸模式
- 安装passthru驱动的问题