数据库相关
mysql使用的函数
字符相关:
concant() 连接字符
trim()去除字符的首尾空格
space(n) 返回n个空格
char_length() 返回字符的个数
ucase()/upper()将字符串 s 的所有字母变成大写字母
lcase()/lower() 将字符串 s 的所有字母变成小写字母
substr/substring/mid(s, start, length)
从字符串 s 的 start 位置截取长度为 length 的子字符串
下标从1开始
SELECT SUBSTR/substring/mid(“RUNOOB”, 2, 3) AS ExtractString; – UNO
数学相关:
max() 最大值
sum()求和
abs()求绝对值
avg()求平均数
count()求个数
floor()取整数
rand()0-1的随机数
ROUND() 取整(四舍五入)
日期相关:
week()和weekofyear()查询日期是第几个星期
weekday()查询日期是星期几,0是星期一
day() 查询日期中的几号
year()查询日期的年份
month()查询日期中的月份
monthname(d)查询日期中的月份名字(英文)
sysdate()/now()/current_timestamp()/localtime()/localtimestamp 查询当前的日期时间
now()与后面3个一样取的是语句开始执行的时间 sysdate取的是动态的实时时间
subdate(‘2011-11-11 11:11:11’, 1) 日期 2011减去 1 天后的日期
返回2011-11-10 11:11:11
mysql特点
1.数据以表格的形式出现
2.每行为各种记录名称
3.每列为记录名称所对应的数据域
4.许多的行和列组成一张表单
5.若干的表单组成database
注:保证数据一致性。
注:关系型数据库,表与表之间存在对应关系。
注:非关系行数据库,表之间不存在关系,数据独立,随便存
事务
在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
事务用来管理 insert,update,delete 语句
一般来说,事务是必须满足4个条件(ACID):
原子性(Atomicity,或称不可分割性)、一致性(Consistency)、
隔离性(Isolation,又称独立性)、持久性(Durability)
原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
事务处理的方法
1、用 BEGIN, ROLLBACK, COMMIT来实现
BEGIN 开始一个事务
ROLLBACK 事务回滚
COMMIT 事务确认
2、直接用 SET 来改变 MySQL 的自动提交模式:
SET AUTOCOMMIT=0 禁止自动提交
SET AUTOCOMMIT=1 开启自动提交
索引是否会失效
1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)
注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引
2.对于多列索引,不是使用的第一部分,则不会使用索引
3.like查询是以%开头(以%结尾是可以的)
4.如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
5.如果mysql估计使用全表扫描要比使用索引快,则不使用索引
Mysql数据库引擎
MyISAM、InnoDB、MEMORY、Archive
MyISAM
MyISAM基于ISAM存储引擎,并对其进行扩展。它是在Web、数据仓储和其他应用环境下最常使用的存储引擎之一。MyISAM拥有较高的插入、查询速度,但不支持事务。
MyISAM主要特性有:
1、大文件(达到63位文件长度)在支持大文件的文件系统和操作系统上被支持。
2、当把删除和更新及插入操作混合使用的时候,动态尺寸的行产生更少碎片。这要通过合并相邻被删除的块,以及若下一个块被删除,就扩展到下一块自动完成。
3、每个MyISAM表最大索引数是64,这可以通过重新编译来改变。每个索引最大的列数是16
4、NULL被允许在索引的列中,这个值占每个键的0~1个字节
5、可以把数据文件和索引文件放在不同目录(InnoDB是放在一个目录里面的)
MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。
下图是MyISAM索引的原理图:
这里设表一共有三列,假设我们以Col1为主键,则上图是一个MyISAM表的主索引(Primary key)示意。可以看出MyISAM的索引文件仅仅保存数据记录的地址。在MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。如果我们在Col2上建立一个辅助索引,则此索引的结构如下图所示:
同样也是一颗B+Tree,data域保存数据记录的地址。因此,MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录。
MyISAM的索引方式也叫做“非聚集”的,之所以这么称呼是为了与InnoDB的聚集索引区分。
InnoDB
InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键,上图也看到了,InnoDB是默认的MySQL引擎。
InnoDB主要特性有:
1、InnoDB给MySQL提供了具有提交、回滚和崩溃恢复能力的事物安全(ACID兼容)存储引擎。InnoDB锁定在行级并且也在SELECT语句中提供一个类似Oracle的非锁定读。这些功能增加了多用户部署和性能。在SQL查询中,可以自由地将InnoDB类型的表和其他MySQL的表类型混合起来,甚至在同一个查询中也可以混合
2、InnoDB是为处理巨大数据量的最大性能设计。它的CPU效率可能是任何其他基于磁盘的关系型数据库引擎锁不能匹敌的
3、InnoDB存储引擎完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。InnoDB将它的表和索引在一个逻辑表空间中,表空间可以包含数个文件(或原始磁盘文件)。这与MyISAM表不同,比如在MyISAM表中每个表被存放在分离的文件中。InnoDB表可以是任何尺寸,即使在文件尺寸被限制为2GB的操作系统上
4、InnoDB支持外键完整性约束,存储表中的数据时,每张表的存储都按主键顺序存放,如果没有显示在表定义时指定主键,InnoDB会为每一行生成一个6字节的ROWID,并以此作为主键。
虽然InnoDB也使用B+Tree作为索引结构,但具体实现方式却与MyISAM截然不同。
第一个重大区别是InnoDB的数据文件本身就是索引文件。
从上文知道,MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索 引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。
上图是InnoDB主索引(同时也是数据文件)的示意图,可以看到叶节点包含了完整的数据记录。这种索引叫做聚集索引。因为InnoDB的数据文件本身 要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列 作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。
第二个与MyISAM索引的不同是InnoDB的辅助索引data域存储相应记录主键的值而不是地址。换句话说,InnoDB的所有辅助索引都引用主键作为data域。例如,下图为定义在Col3上的一个辅助索引:
这里以英文字符的ASCII码作为比较准则。聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。
了 解不同存储引擎的索引实现方式对于正确使用和优化索引都非常有帮助,例如知道了InnoDB的索引实现后,就很容易明白为什么不建议使用过长的字段作为 主键,因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大。再例如,用非单调的字段作为主键在InnoDB中不是个好主意,因为 InnoDB数据文件本身是一颗B+Tree,非单调的主键会造成在插入新记录时数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效,而使用 自增字段作为主键则是一个很好的选择。
MEMORY
MEMORY存储引擎将表中的数据存储到内存中,未查询和引用其他表数据提供快速访问。
MEMORY主要特性有:
1、MEMORY表的每个表可以有多达32个索引,每个索引16列,以及500字节的最大键长度
2、MEMORY存储引擎执行HASH和BTREE缩影
3、可以在一个MEMORY表中有非唯一键值
4、MEMORY表使用一个固定的记录长度格式
5、MEMORY不支持BLOB或TEXT列
6、MEMORY支持AUTO_INCREMENT列和对可包含NULL值的列的索引
7、MEMORY表在所由客户端之间共享(就像其他任何非TEMPORARY表)
8、MEMORY表内存被存储在内存中,内存是MEMORY表和服务器在查询处理时的空闲中,创建的内部表共享
9、当不再需要MEMORY表的内容时,要释放被MEMORY表使用的内存,应该执行DELETE FROM或TRUNCATE TABLE,或者删除整个表(使用DROP TABLE)
Archive
会缓存所有的写并且利用zlib对插入的行进行压缩,所以Archive搜索引擎比MyISAM存储引擎的表,更加节约磁盘I/O,对于同样数量级的数据,Archive存储引擎比MyISAM、InnoDB更加节约存储空间,一个几T的数据表数据存储到Archive存储引擎表中,可能只需要几百兆的存储空间就可以了;
Archive存储引擎数据文件都是ARZ为后缀文件,另外的和其他存储引擎一样,Archive存储引擎也存在一个以frm为后缀的文件,用于存储这种表的结构信息,这就是Archive存储引擎在文件系统中存储的一些特点。
Archive存储引擎特点
1.只支持insert和select操作【Archive存储引擎支持行级锁和专用的缓冲区,可以实现并发的插入,这种存储引擎在某些方面的模仿了事务存储引擎的一些特点,但是Archive本身并不是一种是事务的存储引擎】
2.只允许在自增的ID上加索引
使用场景
Archive是无法在OLTP类的应用中所使用的,因为它不支持对数据的修改,而OLTP中一定会对数据进行修改,对于一些数据仓库的应用,或者一些特殊的表,如:记录日志类的表或者数据采集的表,由于会要存储大量的数据,就比较适合Archive存储引擎,存储空间占用最小。
注意:即使是在日志采集和数据的应用中,Archive存储引擎也是无法进行数据的删除和更新的。
Mysql存储引擎的选择
不同的存储引擎都有各自的特点,以适应不同的需求,如下表所示:
InnoDB :如果要提供提交、回滚、崩溃恢复能力的事务安全(ACID兼容)能力,并要求实现并发控制,InnoDB是一个好的选择
MyISAM:如果数据表主要用来插入和查询记录,则MyISAM(但是不支持事务)引擎能提供较高的处理效率
Memory:如果只是临时存放数据,数据量不大,并且不需要较高的数据安全性,可以选择将数据保存在内存中的Memory引擎,MySQL中使用该引擎作为临时表,存放查询的中间结果。数据的处理速度很快但是安全性不高。
Archive:如果只有INSERT和SELECT操作,可以选择Archive,Archive支持高并发的插入操作,但是本身不是事务安全的。Archive非常适合存储归档数据,如记录日志信息可以使用Archive
InnoDB 和 MyISAM之间的区别:
1>.InnoDB支持事务,而MyISAM不支持事务
2>.InnoDB支持行级锁,而MyISAM支持表级锁
3>.InnoDB支持MVCC, 而MyISAM不支持
4>.InnoDB支持外键,而MyISAM不支持
5>.InnoDB不支持全文索引,而MyISAM支持。
使用哪一种引擎需要灵活选择,一个数据库中多个表可以使用不同引擎以满足各种性能和实际需求,使用合适的存储引擎,将会提高整个数据库的性能
sql相关
select 字段 from 表名 where 条件
insert into 表名 (字段)values(值)
update 表名 set 字段=值 where 条件
delete from 表名 where 条件
update和delete如果没有跟where子句,那么该表中的所有数据将会改变
分页怎样实现
limit 字段1,字段2
第一个字段从那个数据开始,第二个字段显示每页数据的总数
处理重复数据
双主键模式来设置数据的唯一性, 如果你设置了双主键,那么那个键的默认值不能为 NULL,可设置为 NOT NULL。
CREATE TABLE person_tbl
(
first_name CHAR(20) NOT NULL,
last_name CHAR(20) NOT NULL,
sex CHAR(10),
PRIMARY KEY (last_name, first_name)
);
如果我们设置了唯一索引,那么在插入重复数据时,SQL 语句将无法执行成功,并抛出错。
INSERT IGNORE INTO 与 INSERT INTO 的区别就是 INSERT IGNORE INTO 会忽略数据库中已经存在的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据。这样就可以保留数据库中已经存在数据,达到在间隙中插入数据的目的。
insert ignore into 执行后不会出错,也不会向数据表中插入重复数据:
第一次插入数据
insert ignore into person_tbl (last_name, first_name) values(‘Jay’,‘Thomas’)
Query OK, 1 row affected (0.00 sec)
第二次插入数据
insert ignore into person_tbl (last_name, first_name) values(‘Jay’,‘Thomas’)
Query OK, 0 rows affected (0.00 sec)
NSERT IGNORE INTO 当插入数据时,在设置了记录的唯一性后,如果插入重复数据,将不返回错误,只以警告形式返回。
查询重复数据语法
select 列名1,count(1) as count
from 表名
group by 列名1
having count>1 and 其他条件
select 列名1,列名2,count(1) as count
from 表名
group by 列名1,列名2
having count>1 and 其他条件
过滤重复数据
如果你需要读取不重复的数据可以在 select 语句中使用 distinct 关键字来过滤重复数据。
select distinct last_name, first_name from person_tbl;
也可以使用 GROUP BY 来读取数据表中不重复的数据
select last_name, first_name from person_tbl group by (last_name, first_name);
获取AUTO_INCREMENT值
可以使用 SQL中的LAST_INSERT_ID( ) 函数来获取最后的插入表中的自增列的值。
alter
修改数据表名或者修改数据表字段
修改字段,如果数据表中只剩余一个字段则无法使用DROP来删除字段。
ALTER TABLE testalter_tbl DROP i;
添加列
ALTER TABLE testalter_tbl ADD i INT;
如果你需要指定新增字段的位置,可以使用MySQL提供的关键字 FIRST (设定位第一列), AFTER 字段名(设定位于某个字段之后)。
ALTER TABLE testalter_tbl ADD i INT FIRST;
ALTER TABLE testalter_tbl ADD i INT AFTER c;
FIRST 和 AFTER 关键字可用于 ADD 与 MODIFY 子句,所以如果你想重置数据表字段的位置就需要先使用 DROP 删除字段然后使用 ADD 来添加字段并设置位置。
修改字段类型及名称
如果需要修改字段类型及名称, 你可以在ALTER命令中使用 MODIFY 或 CHANGE 子句 。
ALTER TABLE testalter_tbl MODIFY c CHAR(10);
在 CHANGE 关键字之后,紧跟着的是你要修改的字段名,然后指定新字段名及类型。
ALTER TABLE testalter_tbl CHANGE i j BIGINT;
当你修改字段时,你可以指定是否包含值或者是否设置默认值。如果你不设置默认值,MySQL会自动设置该字段默认为 NULL。
ALTER TABLE testalter_tbl MODIFY j BIGINT NOT NULL DEFAULT 100;
修改字段默认值
ALTER TABLE testalter_tbl ALTER i SET DEFAULT 1000;
ALTER 命令及 DROP子句来删除字段的默认值
ALTER TABLE testalter_tbl ALTER i DROP DEFAULT;
修改数据表类型 ALTER 命令及 TYPE 子句实现
ALTER TABLE testalter_tbl ENGINE = MYISAM;
修改表名 ALTER TABLE 语句中使用 RENAME 子句来实现
ALTER TABLE testalter_tbl RENAME TO alter_tbl;
修改存储引擎:修改为myisam
alter table tableName engine=myisam;
删除外键约束:keyName是外键别名
alter table tableName drop foreign key keyName;
修改字段的相对位置:这里name1为想要修改的字段,type1为该字段原来类型,first和after二选一,这应该显而易见,first放在第一位,after放在name2字段后面
alter table tableName modify name1 type1 first|after name2;
执行顺序
select –>where –> group by–> having–>order by
where 后跟的字段
WHERE
GROUP BY 字段
HAVING 条件
WINDOW functions
SELECT
DISTINCT
UNION
ORDER BY 字段 ASC 或 DESC 升序/降序
LIMIT and OFFSET
0/1 执行隐式转换0为false1为true
like模糊查询
M 为要查询内容中的模糊信息。
% 表示多个字值,_ 下划线表示一个字符;
M% : 为能配符,正则表达式,表示的意思为模糊查询信息为 M 开头的。
%M% : 表示查询包含M的所有内容。
%M_ : 表示查询以M在倒数第二位的所有内容
连接
测试数据
inner join
获取两个表中字段匹配关系的记录。
SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a INNER JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;
left join
获取左表所有记录,即使右表没有对应匹配的记录。
SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a LEFT JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;
right join
与 LEFT JOIN 相反,用于获取右表所有记录,即使左表没有对应匹配的记录。
SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a RIGHT JOIN tcount_tbl b ON a.runoob_author = b.runoob_author;
union
连接两个以上的 SELECT 语句的结果组合到一个结果集合中。多个 SELECT 语句会删除重复的数据。
UNION 语句:用于将不同表中相同列中查询的数据展示出来;(不包括重复数据)
SELECT 列名 FROM 表名 UNION SELECT 列名 FROM 表名 ORDER BY 列名;
UNION ALL 语句:用于将不同表中相同列中查询的数据展示出来;(包括重复数据)
SELECT 列名 FROM 表名 UNION ALL SELECT 列名 FROM 表名 ORDER BY 列名;
正则表达式
where 字段 REGEXP '正则条件
索引
单列索引,即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引。
组合索引,即一个索引包含多个列。
创建索引时,你需要确保该索引是应用在 SQL 查询语句的条件(一般作为 WHERE 子句的条件)。
实际上,索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录。
缺点:虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件。
建立索引会占用磁盘空间的索引文件。
’
普通索引
(1)创建索引:方式
语法:
CREATE INDEX indexName ON table_name (column_name)
如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length。
(2)修改表结构(添加索引)
ALTER table tableName ADD INDEX indexName(columnName)
(3)创建表的时候直接指定
CREATE TABLE mytable(
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
INDEX [indexName] (username(length))
);
删除索引
DROP INDEX [indexName] ON mytable;
唯一索引
它与前面的普通索引类似,不同的就是:索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。
创建方式:
(1)创建索引
CREATE UNIQUE INDEX indexName ON mytable(username(length))
(2)修改表结构
ALTER table mytable ADD UNIQUE [indexName] (username(length))
(3)创建表的时候直接指定
CREATE TABLE mytable(
ID INT NOT NULL,
username VARCHAR(16) NOT NULL,
UNIQUE [indexName] (username(length))
);
使用ALTER 命令添加和删除索引
(1)ALTER TABLE tbl_name ADD PRIMARY KEY (column_list): 该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。
(2)ALTER TABLE tbl_name ADD UNIQUE index_name (column_list): 这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。
(3)ALTER TABLE tbl_name ADD INDEX index_name (column_list): 添加普通索引,索引值可出现多次。
(4)ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list):该语句指定了索引为 FULLTEXT ,用于全文索引。
使用 ALTER 命令添加和删除主键
主键作用于列上(可以一个列或多个列联合主键),添加主键索引时,你需要确保该主键默认不为空(NOT NULL)。
ALTER TABLE testalter_tbl MODIFY i INT NOT NULL;
ALTER TABLE testalter_tbl ADD PRIMARY KEY (i);
使用 ALTER 命令删除主键:
ALTER TABLE testalter_tbl DROP PRIMARY KEY;
显示索引信息
SHOW INDEX FROM table_name; \G
复制表
1.使用 SHOW CREATE TABLE 命令获取创建数据表(CREATE TABLE) 语句,该语句包含了原数据表的结构,索引等。
SHOW CREATE TABLE 表名\G;
2.复制以下命令显示的SQL语句,修改数据表名,并执行SQL语句,通过以上命令 将完全的复制数据表结构。
CREATE TABLE clone_tbl
(
-> runoob_id
int(11) NOT NULL auto_increment,
-> runoob_title
varchar(100) NOT NULL default ‘’,
-> runoob_author
varchar(40) NOT NULL default ‘’,
-> submission_date
date default NULL,
-> PRIMARY KEY (runoob_id
),
-> UNIQUE KEY AUTHOR_INDEX
(runoob_author
)
-> ) ENGINE=InnoDB;
3.如果你想复制表的内容,你就可以使用 INSERT INTO … SELECT 语句来实现。
INSERT INTO
clone_tbl(runoob_id, runoob_title, runoob_author, submission_date)
SELECT
runoob_id,runoob_title, runoob_author,submission_dateFROM runoob_tbl;
另一种方法:
CREATE TABLE targetTable LIKE sourceTable;
INSERT INTO targetTable SELECT * FROM sourceTable;
mysql复制表的两种方式。
1.只复制表结构到新表
create table 新表 select * from 旧表 where 1=2/create table 新表 like 旧表
2.复制表结构及数据到新表
create table新表 select * from 旧表
防止sql注入
所谓SQL注入,就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。
我们永远不要信任用户的输入,我们必须认定用户输入的数据都是不安全的,我们都需要对用户输入的数据进行过滤处理。
防止SQL注入,我们需要注意以下几个要点:
1.永远不要信任用户的输入。对用户的输入进行校验,可以通过正则表达式,或限制长度;对单引号和 双"-"进行转换等。
2.永远不要使用动态拼装sql,可以使用参数化的sql或者直接使用存储过程进行数据查询存取。
3.永远不要使用管理员权限的数据库连接,为每个应用使用单独的权限有限的数据库连接。
4.不要把机密信息直接存放,加密或者hash掉密码和敏感的信息。
5.应用的异常信息应该给出尽可能少的提示,最好使用自定义的错误信息对原始错误信息进行包装
6.sql注入的检测方法一般采取辅助软件或网站平台来检测,软件一般采用sql注入检测工具jsky,网站平台就有亿思网站安全平台检测工具。MDCSOFT SCAN等。采用MDCSOFT-IPS可以有效的防御SQL注入,XSS攻击等。
PHP的MySQL扩展提供了mysqli_real_escape_string()函数来转义特殊的输入字符。
if (get_magic_quotes_gpc())
{
$name = stripslashes($name);
}
$name = mysqli_real_escape_string($conn, $name);
mysqli_query($conn, "SELECT * FROM users WHERE name='{$name}'");
like语句注入
ike查询时,如果用户输入的值有"“和”%",则会出现这种情况:用户本来只是想查询"abcd",查询结果中却有"abcd_"、“abcde”、“abcdf"等等;用户要查询"30%”(注:百分之三十)时也会出现问题。
$sub = addcslashes(mysqli_real_escape_string($conn, "%something_"), "%_");
// $sub == \%something\_
mysqli_query($conn, "SELECT * FROM messages WHERE subject LIKE '{$sub}%'");
sql语句性能优化
1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
2.应尽量避免在 where 子句中使用!=或<>操作符, MySQL只有对以下操作符才使用索引:<,<=,=,>,>=,BETWEEN,IN,以及某些时候的LIKE。
3. 应尽量避免在 where 子句中使用 or 来连接条件, 否则将导致引擎放弃使用索引而进行全表扫描,可以使用UNION合并查询
4.尽可能的使用 varchar代替 char, 因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些
索引优化和sql优化
1避免有索引但未被用到的情况:
(1) Like的参数以通配符开头时
(2)where条件不符合最左前缀原则时
(3)使用!= 或 <> 操作符时
(4)使用or来连接条件
2.避免使用 Select *
3.对order by语句进行优化: 1.重写order by语句以使用索引 2.避免在order by子句中使用表达式。
4.对group by语句进行优化:将不需要的记录在group by之前过滤掉
5.使用exists代替in
Mysql为什么选择B+树
B树,B+树,以及两者的区别
B树是一种多路平衡查找树,其每一个节点都存储Key和data
B+树是B树的一个变种,叶子节点存储data,非叶子节点只存储key,B+树的叶子节点增加了顺序访问指针,每一个叶子节点都可以访问到他的下一个叶子节点
区别
1.B+树种只有叶子节点会带有全部信息,非叶子节点只起到索引的作用,
.B树的所有节点都带有全部信息,B+树的每一层节点都会再次出现在下一层节点上
2.B+树种所有叶子节点都是通过指针连在一起,B树则没有
为什么选择b+树
1.Mysql数据本质上是放在外部存储的,B+树是为了加快读取速度而设计的一种数据结构
2.可以减少i/o次数,只有叶子节点才存储数据,非叶子节点存储索引,这样一次读取到内存的关键字增多,相对i/o次数也就减少(根据区别一)
.能够提供稳定高效的范围扫描,因为所有的叶子节点都互相连接(根据区别二)