索引的作用就是快速找出在一个列上用一特定值的行。如果没有索引,MySQL不得不首先以第一条记录开始并然后读完整个表直到它找出相关的行。

索引的类型:

先写一个建表语句:

CREATE TABLE `t_order` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
  `order_no` varchar(20) NOT NULL COMMENT '订单编号',
  `ibank_order_no` varchar(22) DEFAULT NULL COMMENT '银码头订单号',
  `user_id` varchar(16) NOT NULL COMMENT '用户id',
  `member_id` varchar(16) DEFAULT NULL COMMENT '会员id',
  `member_fee` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '会员费',
  `member_type` varchar(10) DEFAULT NULL COMMENT '会员类型',
  `channel` int(4) NOT NULL DEFAULT '0' COMMENT '用户渠道(0 侬要贷 1银码头)',
  `loan_purpose` varchar(36) NOT NULL COMMENT '借款用途',
  `loan_amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '借款金额',
  `borrow_time` tinyint(4) NOT NULL DEFAULT '0' COMMENT '借款时长',
  `borrow_periods` tinyint(4) NOT NULL DEFAULT '1' COMMENT '借款期数',
  `real_loan_amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '实际借款金额',
  `repay_total_amount` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '应还款总金额',
  `interest` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '利息',
  `annualized_rate` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '年化利率',
  `synthetical_fee` decimal(10,2) NOT NULL DEFAULT '0.00' COMMENT '综合费用',
  `bank_account` varchar(30) NOT NULL DEFAULT '' COMMENT '打款银行卡号',
  `bank_name` varchar(20) NOT NULL DEFAULT '' COMMENT '打款银行名称',
  `order_status` smallint(6) NOT NULL DEFAULT '10' COMMENT '订单状态 审核中/审核完成/待放款/放款失败/已放款',
  `audit_status` varchar(10) NOT NULL DEFAULT '0' COMMENT '审核结果:1通过0拒绝',
  `who_audit` int(4) NOT NULL DEFAULT '0' COMMENT '机审还是人审(0:机审|1:人审)',
  `audit_reason` varchar(255) NOT NULL DEFAULT '' COMMENT '详细原因码表',
  `loan_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '借款时间',
  `pay_time` datetime DEFAULT NULL COMMENT '放款时间',
  `promise_repayment_time` datetime DEFAULT NULL COMMENT '约定还款时间',
  `fund_code` varchar(10) NOT NULL DEFAULT '' COMMENT '资金渠道',
  `business` varchar(36) NOT NULL DEFAULT 'nyd' COMMENT '会员使用业务范围',
  `test_status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '是否测试申请 0:是;1:不是',
  `delete_flag` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否已删除 0:正常;1:已删除',
  `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
  `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
  `update_by` varchar(36) NOT NULL DEFAULT 'sys' COMMENT '最后修改人',
  `fail_type` tinyint(2) NOT NULL DEFAULT '0' COMMENT '放款失败类型 0:默认值 1:系统放款失败 2:前端手工取消放款',
  `pay_fail_reason` varchar(300) DEFAULT NULL COMMENT '放款失败原因',
  PRIMARY KEY (`id`),
  UNIQUE KEY `order_no` (`order_no`),
  KEY `idx_user_id` (`user_id`),
  KEY `idx_status` (`order_status`),
  KEY `ix_create_time` (`create_time`),
  KEY `create_time` (`create_time`),
  KEY `update_time` (`update_time`),
  KEY `ibank_order_no` (`ibank_order_no`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='订单信息表';

1.常规索引

index或key,就是所谓的常规索引,也叫作普通索引。

 

2.  主键索引

主键索引(Primary Key),也简称主键。它可以提高查询效率,并提供唯一性约束。一张表中只能有一个主键。

 

3.唯一索引

唯一索引(Unique Key),可以提高查询效率,并提供唯一性约束。一张表中可以有多个唯一索引。

 

4.全文索引

全文索引(Full Text),可以提高全文搜索的查询效率,一般使用Sphinx替代。但Sphinx不支持中文检索,Coreseek是支持中文的全文检索引擎,也称作具有中文分词功能的Sphinx。实际项目中,我们用到的是Coreseek。

 

5.外键索引

外键索引(Foreign Key),简称外键,它可以提高查询效率,外键会自动和对应的其他表的主键关联。外键的主要作用是保证记录的一致性和完整性。