Encontrar filas repetidas en Mysql

Mysql es una base de datos relacional, por lo que en general usamos relaciones (Dah !) que tienen que ser únicas a través de llaves primarias y foráneas. A veces nos pasan información que incluir en una tabla de manera directa que no necesariamente viene bien filtrada.

Cómo uno de nuestros fuertes en la empresa son los regalos corporativos, y dentro de ellos están los regalos de fin de año, muchas veces dependemos que las empresas con las cuales trabajamos nos manden la lista de empleados. En general esta información es entregada en un Excel o un CSV que puede tener datos repetidos que debemos filtrar.

Antiguamente para este objeto de encontrar filas repetidas realizaba un join de la tabla consigo misma, pero descubrí un método mucho más sencillo y menos tedioso.

SELECT * FROM `Empleados` group by `RUT` having count(*) >= 2 

De esta manera también podemos eliminar de la lista automáticamente los que estén repetidos.

Como no podemos actualizar una tabla en base a la misma, creamos una tabla temporal con estos datos.

CREATE TABLE temporal AS
SELECT `RUT` FROM `Empleados` group by `RUT` having count(*) >= 2

Ahora simplemente eliminamos los datos repetidos que aparecen en nuestra nueva tabla.

DELETE FROM `Empleados` 
WHERE `RUT` in (
    SELECT `RUT` from temporal
)
limit 1

Si bien el código anterior simplemente borra un solo registro, se entiende la idea. Ojo, si ejecutas nuevamente la sentencia existe la posibilidad que borres nuevamente el mismo registro que ya no estará repetido.

¡Mantengamos el contacto!

Me encantaría que te mantuvieras al día con el contenido que estoy generando. Recuerda que no es solo el blog, son las redes sociales, libros, y distintos pódcast 😎.

Hago todo lo posible para no hacer Spam,

👉 ¿Te gustó este contenido? Hay más esperando por ti.

Cada semana, comparto aprendizajes y reflexiones que no encontrarás en ningún otro lugar. ¡Únete a la comunidad de más de 9,000 emprendedores que ya están avanzando!

¡ Twilio Al Rescate ! Solucionando problemas de comunicación

Este post es sobre como solucionamos la perdida de telefonía análoga para poder trabajar de manera normal en la empresa.

Me había rehusado a el cambio a la telefonía IP debido a que pensaba que la análoga era más estable. El resultado de este terrible error es que he tenido intermitencias del servicio telefónico pero no de internet en el último año.

La semana pasada nuestro proveedor de servicios telefónicos para la empresa, del cual no diré el nombre pero empieza con movi y termina star en Chile, tuvo un problema con una de sus centrales en nuestra zona  debido a problemas eléctricos que fueron ocasionados por el temporal. El resultado es que no se pueden recibir ni hacer llamados telefónicos hace una semana ( ¡ Gracias empresa que no puedo mencionar !, me haces la vida mucho más entretenida ).

Creo que está de más decir que para una empresa cuyo foco es darle servicios a otras empresas, en donde el trato es uno a uno y todos los negocios se cierran vía telefónica o en persona NO puede tener problemas telefónicos. Para aprovechar de pasar el dato nuestra empresa es de branding corporativo, regalos corporativos y merchandising, pueden encontrarla en el siguiente link : EmpresasCTM .

Leer más

¿ Desarrollar o no Desarrollar? He ahí el dilema

En que momento debemos desarrollar un software o simplemente usar una solución ya hecha anteriormente por la comunidad.

Recuerdo ya que hace muchos años mi primer blog fue programado 100% por mi, lo desarrollé en php siguiendo un tutorial que había en un libro que compré. Cuanto me arrepentí de haberlo hecho. Un par de años después de tenerlo funcionando un robot lo llenó de comentarios y la BdD colapsó, ni si quiera me di la oportunidad de recuperar el contenido que tenía en él. Estaba demasiado molesto…

Creo que poco antes de desarrollar este CMS ( la verdad ni si quiera se puede llamar así ) pensé en usar un sistema que ya existiera, pero en ese momento ganó el sentimiento de pertenencia y no la lógica por lo que terminé desarrollándolo. Si tuviera que elegir HOY si desarrollar un CMS para blogging personal ni si quiera pensaría en algo distinto a wordpress.

¿ Entonces cuando es necesario o no desarrollar un software ?

Leer más

¿ Es necesario un framework ? Simplificando el desarrollo de software

Esta es una discusión que he tenido en bastantes ocasiones con pares y alumnos. La idea de este post es explicar un poco lo que se ha logrado con todas estas discusiones.

En muchos de los casos durante la universidad no hemos tenido la necesidad de desarrollar un software complejo, un software el cual deba de adaptarse a las necesidades del entorno, las modificaciones de ciertas librerías o simplemente al tiempo. La semana pasada le di el ejemplo a un alumno sobre codeignigter, en mi caso fue el primer framework que utilicé para desarrollo web utilizando php y actualmente ( no se si vaya a cambiar pronto) ya no es compatible con las nuevas versiones de php. Esto le puede pasar a cualquier desarrolo, la cantidad de actualizaciones, parches y modificaciones que salen anualmente son muchas más de las que podemos contar. Si esto le pasa a una aplicación que es mantenida por cientos de personas en la comunidad .. ¿Que nos espera a una aplicación desarrollada por nosotros ?

Leer más

Calcular la máxima cantidad de clientes en Apache2 /prefork

En general la forma de calcular cuanta gente puede acceder de manera concurrente a mi servidor web ( MaxClients ) es sencilla pero bastante manual. Encontré un script en la web de referencia que me puede ayudar a hacerlo de manera más práctica así que lo comparto.

Hace algunos años desarrollando un sistema de regalos corporativos fue la primera vez que me encontré con este problema, si está mal definida la cantidad máxima de usuarios que pueden acceder al apache este consume mucha memoria y en el caso de que tengas el servidor MySQL en el mismo lugar este puede caerse sin ningún aviso.

La idea es que podamos definir bien la cantidad de usuario que puede manejar apache.

Este es el procedimiento que seguiremos.

  1. Definir cantidad de usuarios que pueden acceder concurrentemente al sistema.
  2. Modificar apache para que pueda soportar esta nueva cantidad de usuarios.

Definiendo cantidad de usuarios que pueden acceder

Antes que todo debemos saber cuanta Memoria Ram ( no Swap ! ) tiene nuestro sistema. Eso lo podemos lograr con el comando «free -m«.

ubuntu@ip-10-10-10-69:~$ free -m
             total       used       free     shared    buffers     cached
Mem:          7983       6620       1363         63        183       5584
-/+ buffers/cache:        852       7131
Swap:            0          0          0

En mi caso mi servidor tiene 8Gigas de memoria. Ahora debemos revisar cuanto ocupa Apache ( Ojo, pestaña y ceja, la idea es que apache ocupe la menor cantidad de recursos posibles, para ello puedes optimizar tu sitio con herramientas para el cache).

Para definir la cantidad de memoria que ocupa Apache usaremos un script que nos dice la cantidad de memoria utilizada por proceso llamado ps_mem.py.

Antes de ejecutar esta herramienta simularemos tráfico con BlazeMeter ( ¡La versión gratuita deberá ser suficiente por ahora !), que para mi es la forma más sencilla de simular el  tráfico.

Una vez simulado el tráfico, o durante el utilizamos el script.

ubuntu@ip-10-10-10-69:~$ sudo python ps_mem.py 
 Private  +   Shared  =  RAM used    Program

172.0 KiB +  28.5 KiB = 200.5 KiB    acpid
188.0 KiB +  17.5 KiB = 205.5 KiB    sh
188.0 KiB +  27.5 KiB = 215.5 KiB    atd
256.0 KiB +  54.0 KiB = 310.0 KiB    upstart-file-bridge
256.0 KiB +  54.5 KiB = 310.5 KiB    upstart-socket-bridge
288.0 KiB +  54.0 KiB = 342.0 KiB    cron
288.0 KiB +  79.5 KiB = 367.5 KiB    upstart-udev-bridge
484.0 KiB + 180.0 KiB = 664.0 KiB    su
560.0 KiB + 127.5 KiB = 687.5 KiB    systemd-logind
760.0 KiB +  48.5 KiB = 808.5 KiB    dbus-daemon
788.0 KiB +  67.5 KiB = 855.5 KiB    systemd-udevd
  1.1 MiB + 264.0 KiB =   1.3 MiB    getty (7)
  1.5 MiB +  58.5 KiB =   1.6 MiB    rsyslogd
  1.0 MiB + 659.0 KiB =   1.6 MiB    sudo (2)
  1.6 MiB + 106.5 KiB =   1.7 MiB    init
  1.7 MiB +  49.0 KiB =   1.8 MiB    screen
  2.1 MiB + 128.0 KiB =   2.2 MiB    sendmail-mta
  2.6 MiB +  17.0 KiB =   2.6 MiB    dhclient
  1.3 MiB +   2.1 MiB =   3.4 MiB    sshd (3)
  9.0 MiB +   1.2 MiB =  10.1 MiB    bash (6)
 23.8 MiB +  93.5 KiB =  23.9 MiB    miniserv.pl
102.7 MiB +   1.6 MiB = 104.3 MiB    ajenti-panel
129.6 MiB + 242.5 KiB = 129.8 MiB    mysqld
  1.6 GiB +  59.7 MiB =   1.7 GiB    apache2 (61)
---------------------------------
                          2.0 GiB
=================================

En este caso tenemos que el sistema está usando 2G en total de memoria en donde apache lidera el consumo con 1.7G y 61 usuarios concurrentes.

Para calcular la memoria de apache2 tomaremos las siguientes consideraciones.

  1. Cuanta memoria reservaremos para el sistema.
  2. Cuanta memoria usaremos para mysql.
  3. Cuanta memoria usa en promedio un cliente conectado.
  4. La diferencia entre la memoria disponible y la usada por los otros servicios es la que usaremos para apache.

Por ahora asumiré que ningún otro proceso correrá en el servidor, por lo que 256 megas será suficiente para el sistema.

Mysql usa menos del 10% de apache para 61 usuarios. Es razonable asumir que no pasaremos del uso de 1GB, por lo que usaremos esa cantidad.

Con 61 usuarios conectados el sistema usa 1.7GB de ram, lo que es aproximadamente 28 Megas por cliente conectado. ( En el peor caso. )

La memoria aproximada disponible son los 8Gigas menos 1GB de Mysql menos 256 megas en ram menos 256 megas en ram para tener un margen de error considerable. Esto nos da 6.5GB de ram aproximados disponibles.

6.5*1024/28 = 237

Lo anterior nos da 237 usuarios concurrentes. En mi caso lo dejaré en 250 debido a que la ram ocupada por usuario en general sera menor que los 28 megas y estoy usando un buen sistema de cache para mi sitio.

Configurando el servidor con los nuevos datos.

En general puedes encontrar el archivo de configuración en /etc/apache2/apache2.conf o /etc/httpd/httpd.conf. En mi caso usando Ubuntu Server 14.04 la dirección para configurar el prefork aparece en la carpeta de configuraciones /etc/apache2/mods-enabled/mpm_prefork.conf .

# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# MaxRequestWorkers: maximum number of server processes allowed to start
# MaxConnectionsPerChild: maximum number of requests a server process serves


<IfModule mpm_prefork_module>
StartServers       15
MinSpareServers    15
MaxSpareServers    20
ServerLimit       250
MaxClients        250
MaxRequestsPerChild  4000
</IfModule>

Ok, ahora tenemos un servidor configurado para alojar 250 usuarios de manera concurrente. ¡Al mejorar el rendimiento de apache en el consumo de memoria pueden ser mucho más !

Origen: Fuscata Consulting :: Knowledge Base :: How To Set MaxClients in Apache/prefork

¡Mantengamos el contacto!

Me encantaría que te mantuvieras al día con el contenido que estoy generando. Recuerda que no es solo el blog, son las redes sociales, libros, y distintos pódcast 😎.

Hago todo lo posible para no hacer Spam,

👉 ¿Te gustó este contenido? Hay más esperando por ti.

Cada semana, comparto aprendizajes y reflexiones que no encontrarás en ningún otro lugar. ¡Únete a la comunidad de más de 9,000 emprendedores que ya están avanzando!