当数据量到达一定的量级之后,一般而言是10万。数据库mysql的索引将变得尤其的重要。
没有索引的话,mysql将会遍历整个表来查询满足的条件,大家想想遍历一遍1000万的数据需要多长的时间呢。
不过,在使用mysql的索引的时候,小小的注意几点可能会给存储性能以及执行查询和更新语句的性能带来很大的提高。
根据实际操作中的一些经验,总结几条如下:
1 只有需要用到了字段才为其简历索引,索引也是为占用存储空间的。如果索引过多的话,更新的时候也要更新索引部分的数据,性能就不怎么好了。
2 简短的字符串类的索引,如char、varchar、text的列而言,如果能够确定索引的长度的就确定索引的长度,不要使用一个长长的索引长度,性能影响很大
3 除了主键以为还可以使用unique索引,一一对应的索引的话,如果hash表其查询的性能肯定是卓越的。因为只需要o(1)的复杂度晒。
4 遵从mysql的最左前缀的复合索引规则,根据where语句中使用的方式来定义复合的索引。例如建立了这么一个复合的索引(col1,col2,col3),那么在where时可以使用的索引有where col1 = **或者where col1 = ** and col2 = **或者 where col1 = ** and col2 = ** and col3 = **
最后的话,explain你的sql语句看看是否使用到索引,如果没有,赶快去加上吧。
呵呵,还要注意一点哦,mysql提供的丰富多彩的字符串函数并不是一个很好的东东哦,这些函数应用在where中的列上时是不会使用到索引的。如 where ucase(col1) = ***,即使col1上有索引,由于使用了函数转换,mysql并不能使用上之前建立的索引值。
使用mysql的api时,常常会遇到错误码。
总结了一下这些错误码的含义,方便后续程序遇到时来查看,呵呵。
1005:创建表失败
1006:创建数据库失败
1007:数据库已存在,创建数据库失败
1008:数据库不存在,删除数据库失败
1009:不能删除数据库文件导致删除数据库失败
1010:不能删除数据目录导致删除数据库失败
1011:删除数据库文件失败
1012:不能读取系统表中的记录
1020:记录已被其他用户修改
1021:硬盘剩余空间不足,请加大硬盘可用空间
1022:关键字重复,更改记录失败
1023:关闭时发生错误
1024:读文件错误
1025:更改名字时发生错误
1026:写文件错误
1032:记录不存在
1036:数据表是只读的,不能对它进行修改
1037:系统内存不足,请重启数据库或重启服务器
1038:用于排序的内存不足,请增大排序缓冲区
1040:已到达数据库的最大连接数,请加大数据库可用连接数
1041:系统内存不足
1042:无效的主机名
1043:无效连接
1044:当前用户没有访问数据库的权限
1045:不能连接数据库,用户名或密码错误
1048:字段不能为空
1049:数据库不存在
1050:数据表已存在
1051:数据表不存在
1054:字段不存在
1065:无效的SQL语句,SQL语句为空
1081:不能建立Socket连接
1114:数据表已满,不能容纳任何记录
1116:打开的数据表太多
1129:数据库出现异常,请重启数据库
1130:连接数据库失败,没有连接数据库的权限
1133:数据库用户不存在
1141:当前用户无权访问数据库
1142:当前用户无权访问数据表
1143:当前用户无权访问数据表中的字段
1146:数据表不存在
1147:未定义用户对数据表的访问权限
1149:SQL语句语法错误
1158:网络错误,出现读错误,请检查网络连接状况
1159:网络错误,读超时,请检查网络连接状况
1160:网络错误,出现写错误,请检查网络连接状况
1161:网络错误,写超时,请检查网络连接状况
1062:字段值重复,入库失败
1169:字段值重复,更新记录失败
1177:打开数据表失败
1180:提交事务失败
1181:回滚事务失败
1203:当前用户和数据库建立的连接已到达数据库的最大连接数,请增大可用的数据库连接数或重启数据库
1205:加锁超时
1211:当前用户没有创建用户的权限
1216:外键约束检查失败,更新子表记录失败
1217:外键约束检查失败,删除或修改主表记录失败
1226:当前用户使用的资源已超过所允许的资源,请重启数据库或重启服务器
1227:权限不足,您无权进行此操作
1235:MySQL版本过低,不具有本功能
在linux下写后台程序的时候,为了了解一些系统调用函数的出错信息,我们使用全局的errno来标识
但是对于errno你知道多少呢。
124 EMEDIUMTYPE Wrong medium type
123 ENOMEDIUM No medium found
122 EDQUOT Disk quota exceeded
121 EREMOTEIO Remote I/O error
120 EISNAM Is a named type file
119 ENAVAIL No XENIX semaphores available
118 ENOTNAM Not a XENIX named type file
117 EUCLEAN Structure needs cleaning
116 ESTALE Stale NFS file handle
115 EINPROGRESS +Operation now in progress
114 EALREADY Operation already in progress
113 EHOSTUNREACH No route to host
112 EHOSTDOWN Host is down
111 ECONNREFUSED Connection refused
110 ETIMEDOUT +Connection timed out
109 ETOOMANYREFS Too many references: cannot splice
108 ESHUTDOWN Cannot send after transport endpoint shutdown
107 ENOTCONN Transport endpoint is not connected
106 EISCONN Transport endpoint is already connected
105 ENOBUFS No buffer space available
104 ECONNRESET Connection reset by peer
103 ECONNABORTED Software caused connection abort
102 ENETRESET Network dropped connection on reset
101 ENETUNREACH Network is unreachable
100 ENETDOWN Network is down
99 EADDRNOTAVAIL Cannot assign requested address
98 EADDRINUSE Address already in use
97 EAFNOSUPPORT Address family not supported by protocol
96 EPFNOSUPPORT Protocol family not supported
95 EOPNOTSUPP Operation not supported
94 ESOCKTNOSUPPORT Socket type not supported
93 EPROTONOSUPPORT Protocol not supported
92 ENOPROTOOPT Protocol not available
91 EPROTOTYPE Protocol wrong type for socket
90 EMSGSIZE +Message too long
89 EDESTADDRREQ Destination address required
88 ENOTSOCK Socket operation on non-socket
87 EUSERS Too many users
86 ESTRPIPE Streams pipe error
85 ERESTART Interrupted system call should be restarted
84 EILSEQ Invalid or incomplete multibyte or wide character
83 ELIBEXEC Cannot exec a shared library directly
82 ELIBMAX Attempting to link in too many shared libraries
81 ELIBSCN .lib section in a.out corrupted
80 ELIBBAD Accessing a corrupted shared library
79 ELIBACC Can not access a needed shared library
78 EREMCHG Remote address changed
77 EBADFD File descriptor in bad state
76 ENOTUNIQ Name not unique on network
75 EOVERFLOW Value too large for defined data type
74 EBADMSG +Bad message
73 EDOTDOT RFS specific error
72 EMULTIHOP Multihop attempted
71 EPROTO Protocol error
70 ECOMM Communication error on send
69 ESRMNT Srmount error
68 EADV Advertise error
67 ENOLINK Link has been severed
66 EREMOTE Object is remote
65 ENOPKG Package not installed
64 ENONET Machine is not on the network
63 ENOSR Out of streams resources
62 ETIME Timer expired
61 ENODATA No data available
60 ENOSTR Device not a stream
59 EBFONT Bad font file format
57 EBADSLT Invalid slot
56 EBADRQC Invalid request code
55 ENOANO No anode
54 EXFULL Exchange full
53 EBADR Invalid request descriptor
52 EBADE Invalid exchange
51 EL2HLT Level 2 halted
50 ENOCSI No CSI structure available
49 EUNATCH Protocol driver not attached
48 ELNRNG Link number out of range
47 EL3RST Level 3 reset
46 EL3HLT Level 3 halted
45 EL2NSYNC Level 2 not synchronized
44 ECHRNG Channel number out of range
43 EIDRM Identifier removed
42 ENOMSG No message of desired type
40 ELOOP Too many levels of symbolic links
39 ENOTEMPTY +Directory not empty
38 ENOSYS +Function not implemented
37 ENOLCK +No locks available
36 ENAMETOOLONG +File name too long
35 EDEADLK +Resource deadlock avoided
34 ERANGE +Numerical result out of range
33 EDOM +Numerical argument out of domain
32 EPIPE +Broken pipe
31 EMLINK +Too many links
30 EROFS +Read-only file system
29 ESPIPE +Illegal seek
28 ENOSPC +No space left on device
27 EFBIG +File too large
26 ETXTBSY Text file busy
25 ENOTTY +Inappropriate ioctl for device
24 EMFILE +Too many open files
23 ENFILE +Too many open files in system
22 EINVAL +Invalid argument
21 EISDIR +Is a directory
20 ENOTDIR +Not a directory
19 ENODEV +No such device
18 EXDEV +Invalid cross-device link
17 EEXIST +File exists
16 EBUSY +Device or resource busy
15 ENOTBLK Block device required
14 EFAULT +Bad address
13 EACCES +Permission denied
12 ENOMEM +Cannot allocate memory
11 EAGAIN +Resource temporarily unavailable
10 ECHILD +No child processes
9 EBADF +Bad file descriptor
8 ENOEXEC +Exec format error
7 E2BIG +Argument list too long
6 ENXIO +No such device or address
5 EIO +Input/output error
4 EINTR +Interrupted system call
3 ESRCH +No such process
2 ENOENT +No such file or directory
1 EPERM +Operation not permitted
# 0 -- Success
这么多errno的说明,调试程序就方便啦!
网站优化之系统瓶颈查找
网站响应慢了,用户开始埋怨,老大安排你去优化,可是优化如何开始呢。
优化开始前一定要理清思路,问自己,网站的瓶颈在哪里。
系统的瓶颈在何方呢?如果你的系统有完善的监控分析系统的话,可以从统计数据和图形上
看到大致的系统瓶颈所在,但是如果你的系统没有这些数据,你又如何来确定系统的瓶颈呢。
按照一般的思路,我们对系统进行逻辑功能的划分,如静态服务器,动态服务器,
数据库服务器,业务逻辑服务器。分别针对对这些服务器的带宽、内存使用、cpu使用率、磁盘使用情况进行
分析,如对于动态服务器而言,其cpu的使用率一般情况下是其瓶颈;而对于静态文件服务器,
由于其逻辑简单,但需要传输大量的文件,其出口的带宽很有可能是其瓶颈;对于数据库服务器,
cpu和磁盘都有可能是瓶颈。
我们可以通过如下几个方面来进行查找和排除:
1 网络带宽
带宽可能是最直接的一个瓶颈,可以很容易的估计到。
假如运营商给你提供了10M的带宽,注意带宽的单位是bit,
如果你的一个页面的大小是10K字节,那么一秒钟的最多的并发量这样计算:
10*1024/8/10=128
如果每秒并发超过这个数字,你的带宽就无法接受了。
或者通过netstat命令来观察一下你的网络收发包的情况,使用netstat -s来观察一些统计
的数据,如果发现等待包队列里总是有大量的包待处理,一方面说明可能你的程序有问题,
另一方面说明可能你的并发量太大,系统已经处理不过来了,可能已经开始丢包了。
按照这个两个思路去检查吧。
2 CPU
如果带宽不是问题,又有这么大的并发量,下一个很容易是问题的就是你的cpu了。
如果你的网站有大量的动态请求,如php操作数据库后再返回,
cgi代码逻辑里有大量的排序等耗费cpu的操作,或者是你的cgi程序
写的不好,会死循环,这时你的cpu就将成为瓶颈。
在linux上试试top命令,看看你的机子的负载,通过最右上角的1分钟、5、15分钟采样的平均负载可以
看到你的机子在一段时间内的一个负载情况,如果过去15分钟你的机子的负载大于你的cpu的数目*5,
说明你的机子很繁忙了,很多进程都需要等待处理了。
或者vmstat -n 1命令,看看你的cpu idle的时间有多少,等待处理的进程数量有多少,磁盘块的读写有多少。
如果cpu idle的时间很少,或者等待处理的进程数量很多,说明你的系统比较繁忙。
3 磁盘操作
如果你的带宽很大,cpu比较的空闲,接下来的瓶颈很可能是磁盘的io操作了。
从内存读取数据是相当快的,但是从硬盘读取数据是内存读取数据的50到100倍的时间,
使用iostat -dx查看一下你的硬盘操作的情况,如果有大量的block阻塞着等待写入到硬盘,
你需要检查一下你的代码,看看是否有大量的日志操作,或者写文件的操作阻塞住了。
4 业务逻辑服务器响应慢
如果上述都ok,而且你的cgi又连接到其它的业务逻辑服务器请求数据的情况,你需要检查
你与业务逻辑服务器之间的连接是否正常,带宽是否够用,你的业务逻辑服务器的性能如何。
5 内存不够用
对于一些大容量缓存的业务服务器,如果缓存过多的内容,淘汰策略不好的话,会导致使用掉过多的内存,
从而引起操作系统进行大量的swap交换,进而影响到系统的性能,成为瓶颈。
通过ipcs -a观看系统的使用的共享内存的情况,如果共享内存使用太多的话,考虑较少一点共享内存的大小。
使用free来来观察系统的内存使用情况,如果发现空闲的内存空间少,使用top命令,然后ctl+M看看
那些进程占用了大量的内存,适当关掉一些进程,部署在其它的服务器上。